JDBC基本概念,池和线程

Dav*_*ann 8 java oracle multithreading connection-pooling jdbc

我总是在单线程环境中使用JavaSE中的JDBC.但是现在我需要使用连接池并让许多线程与数据库(MSSQL和Oracle)进行交互,我很难尝试制作它,因为我似乎缺少api的一些基本功能.

连接和记录a后的AFAIK Connection表示与数据库的picalical tcp/ip连接.它创建的Statement(s)可以被视为与数据库之间的SQL交互Connection.

  • 交易和回滚在哪里?它是在水平Connection还是Statement水平.
  • 'one' Connection创建N语句并将其赋予不同的线程以便让每个人拥有它的使用是否安全Statement

如果没有,并在配置池后像这样:

OracleDataSource ods = new OracleDataSource(); 
ods.setURL("jdbc:oracle:thin:@tnsentryname");
ods.setUser("u");
ods.setPassword("p");
Run Code Online (Sandbox Code Playgroud)
  • 顺便说一句,我在哪里设置连接池大小?

  • 这是我在每个线程中要做的,以便正确使用连接?

// thead run方法

Connection conn = ods.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("the sql");
// do what I need to do with rs
rs.close();
int updateStatus = stmt.executeUpdate("the update");
stmt.close();
conn.close();
Run Code Online (Sandbox Code Playgroud)

//线程运行方法结束

  • 如果池的任何物理连接以某种方式崩溃或断开连接,池是否会自动尝试重新连接并在池中注入新连接,以便后续的pool.getConnection()只获得健康连接?

非常感谢,请原谅我的坏英语.

Jay*_*Jay 7

如果您已经使用单线程掌握了JDBC,那么进入多线程和连接池应该不是什么大问题.您需要做的就是:1.当您需要连接时,从池中而不是直接获取它.2.每个线程都应该有自己的连接.

澄清第2点:如果您获得连接然后将其传递给多个线程,则可能有两个线程尝试同时对同一连接执行查询.Java会抛出异常.每个连接只能有一个活动语句,每个语句只能有一个活动查询(即ResultSet).如果两个线程都持有相同的Connection对象,则它们可能会立即违反此规则.

另一个警告:使用连接池时,要非常小心,在完成后始终关闭连接.池管理器没有明确的方法来知道你何时完成连接,所以如果你没有关闭一个,它会在那里闲置很长一段时间,可能永远取决于池管理器.我始终总是使用try块跟随每个"getConnection",并关闭finally块中的连接.然后我知道在函数退出之前我已经关闭了它.

除此之外,一切都应该和你习惯的一样.


tea*_*bot 6

连接池使用自己的包装器实现来装饰Connection和Statement实例.当您在连接上调用close时,实际上只是将其释放回池中.当您在预准备语句上调用close时,实际上只是将其释放回连接的语句缓存.准备语句时,您可能只是从连接中获取缓存的语句实例.所有这些都隐藏在视图中,因此您不必担心它.

当连接被提供给客户端时,在将连接释放回池之前,任何其他客户端都不再可以使用它.您通常只在需要时获取连接,然后在完成后立即返回它们.由于连接在池中保持打开状态,因此获取和释放连接的开销很小.

您应该像使用单个JBDC连接一样使用池中的连接,并遵循有关资源关闭的最佳实践,这样您就不会泄漏任何连接或语句.在其他一些答案中查看try/catch/finally示例.

池可以管理连接资源并在将它们发送给客户端之前对其进行测试,以确保它们不会过时.池也将根据需要创建和销毁连接.

  • 只是猜测,但是:正如您显然意识到的那样,PreparedStatements必须与Connections分开,因为每个Connection可能有多个PreparedStatement.因此,我认为Java人员将语句分开以使它们与PreparedStatements保持平行.否则你在Connection中有一大堆"语句函数",然后在PreparedStatement中有另外一堆.这会搞乱Statement和PreparedStatement的继承树.正如我所说的,只是猜测.如果有人有这方面的权威来源,我会很高兴听到它. (3认同)