回答

收藏

JDBC和多线程

技术问答 技术问答 449 人阅读 | 0 人回复 | 2023-09-14

我正在尝试使用多线程方法运行一些查询,但是我认为我做错了,因为我的程序大约需要五分钟才能运行一个简单的select语句,例如0 o& Y2 F" p! m* Z" ?; }/ P" P& z
SELECT * FROM TABLE WHERE ID = 123'
8 t6 I0 K9 Q" i4 H! [# g8 ^我的实现如下,并且我正在使用一个连接对象。. E' x& @, C, U' B" j, u
在我的运行方法中
6 {! o, b" c' t8 gpublic void run() {
  V- ]; u- t  X! w. O# G& [    runQuery(conn, query);. S5 D1 C# x" q& ~
}% T4 ^' R; Y- r) G5 H
runQuery方法
9 v* @5 K$ P7 R' Xpublic void runQuery(Connection conn, String queryString){
7 C5 u6 ?# W2 X5 w    Statement statement;1 _: y' [1 E; |8 v7 Y2 T+ z3 ^
    try {
) ?- _) M  N+ j/ i          statement = conn.createStatement();
" {9 \, [2 X% {" D$ H          ResultSet rs = statement.executeQuery(queryString);7 ]/ X. |& k( }; a4 ?
          while (rs.next()) {}
) y1 d& I9 B; t# p    } catch (SQLException e) {
/ D, n* [5 z) _% w        e.printStackTrace();
) w' X3 J# |' |    }( }7 Z8 E" K  z
}
8 E$ E: M/ t, h' h- a) b0 e6 G最后,在main方法中,我使用下面的代码片段启动线程。
- L2 z0 l# b2 b  e( n9 vMyThread bmthread = new MyThread(conn, query);
5 g1 G0 X+ B( d5 gArrayList allThreads = new ArrayList();+ p: H) `% ?8 Z( P' B0 M0 v
double start = System.currentTimeMillis();1 Z& ^$ p  X6 z
    int numberOfThreads = 1;
$ z0 h: W+ j+ @$ O/ t+ @    for(int i=0; i更新:我现在为每个线程使用单独的连接。
6 h& f" P. k* \ArrayList sqlConn = new ArrayList();% b) _9 t. ]" k1 f  B
    for(int i =0; i如rohivats和Asaph所说,一个连接必须由一个线程使用,并且只有一个线程,即考虑使用数据库连接池。考虑到c3p0,DBCP和类似的东西几乎被遗弃了,我将使用HikariCP,它确实是快速而可靠的。  g$ j8 A* \( f6 B
如果您想要非常简单的内容,则可以使用线程安全集合(例如LinkedList)来实现一个非常简单的连接池,例如:# [+ ~- d, |# @8 T, N1 q3 `
public class CutrePool{
, p& m9 A3 n$ E1 u2 c! p/ b& B      String connString;    $ G" w5 T9 X, K; q
      String user;
& u8 f$ D7 M7 C- u# s9 g      String pwd;
1 P  k+ s8 n0 O; l, j! Q+ D9 L0 e0 d      static final int INITIAL_CAPACITY = 50;; _: R4 g) X  t
      LinkedList pool = new LinkedList();
4 m) v& E9 d# p9 L/ i$ i# N9 A      public String getConnString() {
- h5 z* |# @1 o          return connString;
" v2 I! c3 k+ P3 I      }8 T4 r5 i6 |, t5 K# r2 ~( [+ [" c
      public String getPwd() {/ {7 G3 y4 z6 E; n2 s" ~( W1 r
          return pwd;% h7 n5 F; t6 t1 p
      }
1 r8 M: h9 q% B- |2 W8 O      public String getUser() {
" [! N" E/ }* S, I* P8 T: S  L: L          return user;
& Z3 i3 O( C; ]      }, D$ d  r' `: P* K- ~. l1 C
      public CutrePool(String connString, String user, String pwd) throws SQLException {# i+ R$ [6 j2 s) I1 T$ y
          this.connString = connString;) m: f7 a1 ]. H) n- V
          for (int i = 0; i 如您所见,getConnection和returnConnection方法被同步为线程安全的。获得连接(conn =
( Q' R# H1 m+ Q; F) a0 q& n0 Dpool.getConnection();),不要忘了在使用后返回/释放连接(pool.returnConnection(conn);)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则