我在Tomcat上运行Web应用程序.我有一个处理所有数据库查询的类.此类包含Connection返回查询结果的对象和方法.
这是连接对象:
private static Connection conn = null;
Run Code Online (Sandbox Code Playgroud)
它只有一个实例(单例).
另外,我有执行查询的方法,例如在db中搜索用户:
public static ResultSet searchUser(String user, String pass) throws SQLException
Run Code Online (Sandbox Code Playgroud)
此方法使用静态Connection对象.我的问题是,我在静态Connection对象线程中的使用是否安全?或者当很多用户调用该searchUser方法时会引起问题吗?
我试图确定我是否实际使用JDBC连接池.经过一些研究,实施几乎看起来太容易了.事实上比常规连接更容易,所以我想验证.
这是我的连接类:
public class DatabaseConnection {
Connection conn = null;
public Connection getConnection() {
BasicDataSource bds = new BasicDataSource();
bds.setDriverClassName("com.mysql.jdbc.Driver");
bds.setUrl("jdbc:mysql://localhost:3306/data");
bds.setUsername("USERNAME");
bds.setPassword("PASSWORD");
try{
System.out.println("Attempting Database Connection");
conn = bds.getConnection();
System.out.println("Connected Successfully");
}catch(SQLException e){
System.out.println("Caught SQL Exception: " + e);
}
return conn;
}
public void closeConnection() throws SQLException {
conn.close();
}
Run Code Online (Sandbox Code Playgroud)
}
这是真正的连接汇集吗?我在另一个类中使用连接如下:
//Check data against database.
DatabaseConnection dbConn = new DatabaseConnection();
Connection conn;
ResultSet rs;
PreparedStatement prepStmt;
//Query database and check username/pass against table.
try{
conn = dbConn.getConnection(); …Run Code Online (Sandbox Code Playgroud) 我在GlassFish上有一个Java-JSF Web应用程序,我想在其中使用连接池.因此,我创建了一个applicationscoped bean,它Connection为其他bean的实例提供服务:
public class DatabaseBean {
private DataSource myDataSource;
public DatabaseBean() {
try {
Context ctx = new InitialContext();
ecwinsDataSource = (DataSource) ctx.lookup("jdbc/myDataSource");
} catch (NamingException ex) {
ex.printStackTrace();
}
}
public Connection getConnection() throws ClassNotFoundException, SQLException, InstantiationException, IllegalAccessException {
Connection connection = myDataSource.getConnection();
System.out.println("Succesfully connected: " + connection);
//Sample: Succesfully connected: com.sun.gjc.spi.jdbc40.ConnectionHolder40@7fb213a5
return connection;
}
}
Run Code Online (Sandbox Code Playgroud)
这样连接池的填充速度非常快; 在通过"db-related"视图进行一些导航后,应用程序将停止并显示以下内容:
RAR5117:无法从连接池[mysql_testPool]获取/创建连接.原因:正在使用的连接等于max-pool-size和expired max-wait-time.无法分配更多连接.RAR5114:分配连接时出错:[分配连接时出错.原因:正在使用的连接等于max-pool-size和expired max-wait-time.无法分配更多连接.] java.sql.SQLException:分配连接时出错.原因:正在使用的连接等于max-pool-size和expired max-wait-time.无法分配更多连接.
我正在关闭每种方法中的连接和其他资源.应用程序通过独立连接运行一切正常.
我究竟做错了什么?任何提示或建议将不胜感激.
我搜索了连接池并阅读了它.如果我理解正确,连接池就像一组打开的连接.如果建立或创建了连接,则应将其添加到连接池中,如果该连接已关闭,则应在连接池中将其删除; 虽然它是开放的我可以一次又一次地使用它.
在阅读这些有关连接池的教程和解释时,我有一些问题:
是否只能在某台计算机上使用连接池?像ComputerA无法与ComputerB共享其连接池?
应该connection.close()放在哪里?
仅在选择/加载记录时使用连接是否正确?获得返回的记录/数据后,我在finally语句处关闭连接.与添加,编辑和删除记录相同.在处理过程中我放置了一个进度条,因此用户必须等待它完成并再次进行一些处理,这意味着我一次只能打开一个连接.
感谢您的解释.:)
我有一个使用 Tomcat JDBC 连接池的项目。
根据JDK规范,该Connection.close()方法应该释放连接的资源,如Statement和ResultSet。
我知道当使用池中的连接时,该close()方法将被覆盖以将连接释放回池。我想知道这个覆盖的方法是否应该正确关闭相关资源。
Tomcat JDBC 连接池不释放资源,我需要在我的代码中显式关闭所有资源。
是否有任何其他池实现可以在调用时正确关闭所有相关资源Connection.close()?
我有一个独立的 java 应用程序,它使用 Hikaricp 获取消息流、批量并将它们插入到 SQL Server 数据库中。
目前我所做的事情如下:
请注意,我从不关闭连接!一旦达到 maxPoolSize (20),当我尝试获取新连接时会收到错误消息。
我应该在每次批量插入后关闭连接吗?
但是,这意味着我要承担从池中获取连接+在每次批量插入后创建新的准备好的语句的成本。
这是推荐的方法还是有任何替代方法可以减少这种额外成本?
我正在JavaEE环境(weblogic 12)中开发,我的部分代码使用JDBC; 因此,我需要从应用程序服务器获取JDBC连接.
我知道在JavaEE中使用JDBC是一种非常糟糕的做法,但这是一个我无法改变的代码(遗留).
我找到了一种方法,但我不确定这是正确的方法:
@Resource(mappedName="mydsjndipath")
private DataSource ds;
public void foo() {
Connection conn = ds.getConnection();
}
Run Code Online (Sandbox Code Playgroud)
问题是我最后如何处理连接?
我无法真正提交/回滚它,因为我使用的是分布式事务.但我应该至少关闭它吗?
并且JTA事务将始终影响连接(在提交/回滚时)吗?
或许在JavaEE中使用JDBC还有另一种更好的方法吗?(不,EntityManager的本机查询不会这样做)