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水平.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)
//线程运行方法结束
非常感谢,请原谅我的坏英语.
如果您已经使用单线程掌握了JDBC,那么进入多线程和连接池应该不是什么大问题.您需要做的就是:1.当您需要连接时,从池中而不是直接获取它.2.每个线程都应该有自己的连接.
澄清第2点:如果您获得连接然后将其传递给多个线程,则可能有两个线程尝试同时对同一连接执行查询.Java会抛出异常.每个连接只能有一个活动语句,每个语句只能有一个活动查询(即ResultSet).如果两个线程都持有相同的Connection对象,则它们可能会立即违反此规则.
另一个警告:使用连接池时,要非常小心,在完成后始终关闭连接.池管理器没有明确的方法来知道你何时完成连接,所以如果你没有关闭一个,它会在那里闲置很长一段时间,可能永远取决于池管理器.我始终总是使用try块跟随每个"getConnection",并关闭finally块中的连接.然后我知道在函数退出之前我已经关闭了它.
除此之外,一切都应该和你习惯的一样.
连接池使用自己的包装器实现来装饰Connection和Statement实例.当您在连接上调用close时,实际上只是将其释放回池中.当您在预准备语句上调用close时,实际上只是将其释放回连接的语句缓存.准备语句时,您可能只是从连接中获取缓存的语句实例.所有这些都隐藏在视图中,因此您不必担心它.
当连接被提供给客户端时,在将连接释放回池之前,任何其他客户端都不再可以使用它.您通常只在需要时获取连接,然后在完成后立即返回它们.由于连接在池中保持打开状态,因此获取和释放连接的开销很小.
您应该像使用单个JBDC连接一样使用池中的连接,并遵循有关资源关闭的最佳实践,这样您就不会泄漏任何连接或语句.在其他一些答案中查看try/catch/finally示例.
池可以管理连接资源并在将它们发送给客户端之前对其进行测试,以确保它们不会过时.池也将根据需要创建和销毁连接.
| 归档时间: |
|
| 查看次数: |
9462 次 |
| 最近记录: |