相关疑难解决方法(0)

在多线程系统中使用静态java.sql.Connection实例是否安全?

我在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方法时会引起问题吗?

java connection multithreading servlets jdbc

50
推荐指数
1
解决办法
3万
查看次数

我使用JDBC连接池吗?

我试图确定我是否实际使用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)

mysql connection-pooling jdbc java-ee

29
推荐指数
1
解决办法
3万
查看次数

JDBC MySql连接池实践,以避免耗尽连接池

我在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.无法分配更多连接.

我正在关闭每种方法中的连接和其他资源.应用程序通过独立连接运行一切正常.

我究竟做错了什么?任何提示或建议将不胜感激.

java mysql connection-pooling jdbc glassfish

10
推荐指数
1
解决办法
3万
查看次数

Java连接池

我搜索了连接池并阅读了它.如果我理解正确,连接池就像一组打开的连接.如果建立或创建了连接,则应将其添加到连接池中,如果该连接已关闭,则应在连接池中将其删除; 虽然它是开放的我可以一次又一次地使用它.

在阅读这些有关连接池的教程和解释时,我有一些问题:

  1. 是否只能在某台计算机上使用连接池?像ComputerA无法与ComputerB共享其连接池?

  2. 应该connection.close()放在哪里?

仅在选择/加载记录时使用连接是否正确?获得返回的记录/数据后,我在finally语句处关闭连接.与添加,编辑和删除记录相同.在处理过程中我放置了一个进度条,因此用户必须等待它完成并再次进行一些处理,这意味着我一次只能打开一个连接.

感谢您的解释.:)

java database connection-pooling jdbc

5
推荐指数
1
解决办法
6887
查看次数

Tomcat JDBC 连接资源未释放

我有一个使用 Tomcat JDBC 连接池的项目。

根据JDK规范,该Connection.close()方法应该释放连接的资源,如StatementResultSet

我知道当使用池中的连接时,该close()方法将被覆盖以将连接释放回池。我想知道这个覆盖的方法是否应该正确关闭相关资源。

Tomcat JDBC 连接池不释放资源,我需要在我的代码中显式关闭所有资源。

是否有任何其他池实现可以在调用时正确关闭所有相关资源Connection.close()

java tomcat pool jdbc

5
推荐指数
1
解决办法
630
查看次数

关闭 HikariPool 中的连接

我有一个独立的 java 应用程序,它使用 Hikaricp 获取消息流、批量并将它们插入到 SQL Server 数据库中。

目前我所做的事情如下:

  • 从池中获取连接。
  • 创建准备好的语句以使用连接插入
  • 执行批量插入。

请注意,我从不关闭连接!一旦达到 maxPoolSize (20),当我尝试获取新连接时会收到错误消息。

我应该在每次批量插入后关闭连接吗?

  • 从池中获取连接。
  • 创建准备好的语句以使用连接插入
  • 执行批量插入。
  • 关闭准备好的语句和连接。

但是,这意味着我要承担从池中获取连接+在每次批量插入后创建新的准备好的语句的成本。

这是推荐的方法还是有任何替代方法可以减少这种额外成本?

java jdbc hikaricp

3
推荐指数
1
解决办法
5295
查看次数

如何在JavaEE中使用JDBC?

我正在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的本机查询不会这样做)

jta jdbc java-ee

2
推荐指数
1
解决办法
7924
查看次数