我正在研究一個項目,我正在做很多查詢,並且時間是一個考慮事項,所以我想嘗試並實現JDBC多線程。我不確定正確的方法是什麼。使用JNDI正確實現JDBC多線程
這是我的第一個草案實施:
春數據源的Bean:
private DataSource ds;
@Resource(name="jdbc")
public void setDataSource(DataSource ds) {
this.ds = ds;
}
初始化方法:
public void checkUsersMulti(List<User> users) throws Exception {
if(users!= null || users.size() != 0) {
ExecutorService executorService = Executors.newFixedThreadPool(20);
Queue<User> queue = new ConcurrentLinkedQueue<>();
queue.addAll(users);
for (Useruser: users) {
executorService.submit(new ProcessUser(queue));
}
executorService.shutdown();
try {
executorService.awaitTermination(1, TimeUnit.HOURS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
運行的類:
class ProcessUser implements Runnable {
private final Queue<User> queue;
public ProcessUser(Queue<User> queue) {
this.queue = queue;
}
public void run() {
try {
Connection conn = ds.getConnection();
User user = null;
while((user = queue.poll()) != null) {
userDao.getUser(user , conn));
}
DbUtils.closeQuietly(conn);
} catch (Exception e) {
e.printStackTrace();
}
}
}
用戶DAO方法:
public User retrieveUser(User user, Connection conn) {
PreparedStatement st = null;
ResultSet rs = null;
try {
String sql = "SELECT firstname, lastname FROM users WHERE id= ?;
st = conn.prepareStatement(sql);
st.setString(1, user.getId());
rs = st.executeQuery();
while(rs.next()) {
user.setFirstName(rs.getString("firstname"));
user.setLastName(rs.getString("lastname"));
}
} catch (Exception e) {
return null;
}
finally {
DbUtils.closeQuietly(rs);
DbUtils.closeQuietly(st);
}
return user;
}
UPDATE:Tomcat的JNDI連接池設置:
<Resource
name="jdbc"
auth="Container"
type="javax.sql.DataSource"
maxTotal ="25"
maxIdle="30"
maxWaitMillis ="10000"
driverClassName="***Vendor Driver***"
url="***Valid URL"
username="***Valid Username***"
password="***Valid Password***"
/>
不過,我得到這個錯誤偶爾:
java.sql.SQLException: Cannot get a connection, pool error Timeout waiting for idle object
但是,該過程仍按預期完成 - 可能在我的JNDI設置中。我更關心的是,如果這是實現這一目標的「正確」方式。我認爲最好保持連接對象,這樣就不必重新初始化。
'users'的大小是多少?任何大小的「用戶」都會發生問題嗎? –
我的數據集現在約爲200,我會嘗試擴展並收縮它以查看行爲是什麼 - 我實施了@ rmalchow的建議,但我很好奇它的行爲。 –