- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试弄清楚如何在类之间共享已建立的数据库连接以执行不同的 SQL 语句。我通读了一些主题,但由于我对编程相当陌生,我很难将给定的信息适应我的问题。
问题:我有两个类,其中一个类打开与数据库的连接,执行一些 SQL 语句,并调用另一个类仅使用不同的表和 SQL 语句来执行相同的操作。现在,只要我使用它们自己的主要方法和连接单独运行这些类,一切都会正常工作。但是,当一个类调用另一个类时,我会得到不同的异常,具体取决于我迄今为止尝试的解决方法(MySQLNonTransientConnectionException:数据源拒绝建立连接或StackOverflowException)。
以下是我尝试建立一个连接的方法,该连接用于在两个不同的类中执行一些 sql 操作:
public ClassA{
public static Connection dbConn;
//Set up a connection to the database
String dbURL = "jdbc:mysql://<some database>"; //put host, port and database here
Properties connectionProbs = new Properties();
connectionProbs.put("user", "root"); //insert USER here
connectionProbs.put("password", "root"); //insert PASSWORD here
dbConn = null;
try{
dbConn = DriverManager.getConnection(dbURL, connectionProbs);
PreparedStatement useStmt;
try{
useStmt = dbConn.prepareStatement("USE <some database>"); //insert DATABASE here
useStmt.executeUpdate();
}
catch(SQLException e){
e.printStackTrace();
}
//Do some SQL operations
//Call class B to do some SQL operations using the same connection
}
catch(SQLException e){
System.err.println("There was a problem connecting to the database");
e.printStackTrace();
}
finally{
if(dbConn != null)
try{dbConn.close();}catch(SQLException e){e.printStackTrace();}
}
}
为什么 B 类不能使用 A 类的连接,例如通过执行以下操作(这会导致 StackOverflow):
PreparedStatement Stmt = ClassA.dbConn.prepareStatement("INSERT INTO table(ID, name) VALUES (?,?)");
另一方面,如果我尝试建立到同一个数据库(同时运行)的两个单独的连接(使用与上面相同的代码),我会得到 MySQLNonTransientConnectionException: Data sourcerejected同学们的连接。
处理这个问题的最佳方法是什么?我在论坛中偶然发现了 ConnectionPooling,但我找不到适合初学者的资源来详细说明如何将其付诸实践。是否有一种直接的方法来确保不同的类可以连接并操作一个数据库?
感谢您的反馈
最佳答案
您可以通过在 A 类中为 Connection 创建一个非静态全局变量,然后创建一个非静态公共(public)方法来返回此连接来实现此目的,如下所示。
public ClassA{
// non-static global private Connection object
private Connection dbConn = null;
// non-static public method to get dbConn connection object
public Connection getConnection() {
// this condition will check if the Connection is not already open then open it.
if(null == dbConn) {
//Set up a connection to the database
String dbURL = "jdbc:mysql://<some database>"; //put host, port and database here
Properties connectionProbs = new Properties();
connectionProbs.put("user", "root"); //insert USER here
connectionProbs.put("password", "root"); //insert PASSWORD here
try{
dbConn = DriverManager.getConnection(dbURL, connectionProbs);
PreparedStatement useStmt;
try{
useStmt = dbConn.prepareStatement("USE <some database>"); //insert DATABASE here
useStmt.executeUpdate();
}
catch(SQLException e){
e.printStackTrace();
}
//Do some SQL operations
//Call class B to do some SQL operations using the same connection
}
catch(SQLException e){
System.err.println("There was a problem connecting to the database");
e.printStackTrace();
}
finally{
if(dbConn != null)
try{dbConn.close();}catch(SQLException e){e.printStackTrace();}
}
}
return dbConn;
}
}
然后在你的B类中,你可以做这样的事情。
A a = new A();
PreparedStatement Stmt = a.getConnection().prepareStatement("INSERT INTO table(ID, name) VALUES (?,?)");
希望这对您有所帮助。
关于java - 如何在类之间共享数据库连接? (JDBC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26652352/
我是一名优秀的程序员,十分优秀!