java - JDBC 基本概念,池和线程

标签 java oracle multithreading jdbc connection-pooling

我一直在单线程环境下使用 JavaSE 中的 JDBC。但是现在我需要使用连接池并让许多线程与数据库(MSSQL 和 Oracle)进行交互,我很难尝试做到这一点,因为我似乎缺乏对 api 的一些基本理解。

连接并记录 Connection 后的 AFAIK 表示到数据库的物理 tcp/ip 连接。它创建 Statement(s),可以将其视为通过 Connection 与数据库的 SQL 交互。

  • 事务和回滚从何而来?它是在 Connection 还是 Statement 级别。
  • “一个”Connection 创建 N 条语句并将其提供给不同的线程以便让每个线程都拥有该 Statement 的使用是否安全?

如果没有,在配置池之后是这样的:

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

  • 这是为了正确使用连接而在每个线程中执行的操作吗?

//运行方法

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();

//线程运行方法结束

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

非常感谢,请原谅我糟糕的英语。

最佳答案

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

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

另一个警告:使用连接池时,请务必非常小心,在完成后始终关闭连接。池管理器没有明确的方法知道您何时完成连接,因此如果您未能关闭一个连接,它将在那里悬空很长时间,可能永远取决于池管理器。我总是总是总是在每个“getConnection”后面加上一个 try block ,并在 finally block 中关闭连接。然后我知道我在函数退出前关闭了它。

除此之外,一切都应该与您习惯的一样。

关于java - JDBC 基本概念,池和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1272453/

相关文章:

java - 为什么 Future 线程在应用程序后台不起作用?

java - 创建递归迭代器

java - 如何判断第一次登录Java Web App?

sql - 多模式选择语句在 PL/SQL 过程中不起作用?

sql - 发送邮件: ORA-29279 SMTP issue如何解决

javascript - 将图像作为 BLOB 上传到 Oracle DB 时出现 PHP OCI8 警告

C# URL 请求多,处理时间长

java - 如何下载文件而不是在浏览器中打开?

iphone - 从不同线程访问 UIView 的简单快捷方式

c# - 这种异步/等待方法有什么问题?