相关疑难解决方法(0)

Statement和PreparedStatement之间的区别

Prepared Statement是一个稍微强大的Statement语句版本,并且应该始终至少与Statement一样快速和容易处理.
准备好的声明可以参数化

大多数关系数据库分四步处理JDBC/SQL查询:

  1. 解析传入的SQL查询
  2. 编译SQL查询
  3. 规划/优化数据采集路径
  4. 执行优化的查询/获取并返回数据

对于发送到数据库的每个SQL查询,语句将始终执行上述四个步骤.准备语句在上面的执行过程中预先执行步骤(1) - (3).因此,在创建Prepared Statement时,会立即执行一些预优化.其效果是减少执行时数据库引擎的负载.

现在我的问题是 - "使用预备声明还有其他优势吗?"

java jdbc

213
推荐指数
10
解决办法
24万
查看次数

多次重用PreparedStatement

如果将PreparedStatement与没有任何池的单个公共连接一起使用,我是否可以为每个dml/sql操作重新创建一个实例来保证预处理语句的强大功能?

我的意思是:

for (int i=0; i<1000; i++) {
    PreparedStatement preparedStatement = connection.prepareStatement(sql);
    preparedStatement.setObject(1, someValue);
    preparedStatement.executeQuery();
    preparedStatement.close();
}
Run Code Online (Sandbox Code Playgroud)

代替:

PreparedStatement preparedStatement = connection.prepareStatement(sql);
for (int i=0; i<1000; i++) {
    preparedStatement.clearParameters();
    preparedStatement.setObject(1, someValue);
    preparedStatement.executeQuery();
}
preparedStatement.close();
Run Code Online (Sandbox Code Playgroud)

我的问题是因为我想把这段代码放到多线程环境中,你能给我一些建议吗?谢谢

java jdbc prepared-statement

95
推荐指数
2
解决办法
10万
查看次数

在多线程系统中使用静态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万
查看次数

在JDBC中,Connection,Statement和ResultSet应该多久关闭一次?

它们是否需要在每次查询后关闭并在每次查询开始时初始化?

java jdbc

4
推荐指数
1
解决办法
3914
查看次数

如何保持 jdbc 到 postgres 的活动

所以我一直在跟踪一个错误一两天,它发生在我几乎无法控制的远程服务器上。我的代码的来龙去脉是,我向我们的 UI 团队提供了一个 jar 文件,它包装了 postgres 并为用户导入的数据提供存储。由于多种原因,导入过程非常缓慢,其中之一是用户正在导入不可预测的大量数据(我们无法真正减少)。这导致了大量的超时问题。

经过一些初步调查,我将范围缩小到 jdbc 到 postgres 数据库超时。我在本地测试设置中复制此设置时遇到了很多麻烦,但最终通过将连接属性的“socketTimeout”减少到 10 秒(在连接上进行的每次调用之间的时间超过 10 秒)成功解决了这个问题。

我现在的问题是,保持这种活力的最佳方法是什么?我已经将 'tcpKeepAlive' 设置为 true,但这似乎没有效果,我是否需要手动轮询连接或其他什么?根据我的阅读,我假设轮询是自动的,并由操作系统控制。如果这是真的,我真的无法控制运行环境中的操作系统设置,处理这个问题的最佳方法是什么?

我正在考虑在每次使用时测试连接,如果它超时,我将创建一个新连接。这是正确的做法还是有更好的方法来保持连接活跃?我刚刚看了这篇文章,人们建议你应该打开和关闭每个查询的连接: 当我的应用程序丢失连接时,我应该如何恢复它?

在我的情况下,我有一系列顺序插入发生在单个线程上,如果单个插入失败,它们都会失败。为了实现这一点,我使用了交易:

m_Connection.setAutoCommit(false); 
m_TransactionSave = m_Connection.setSavepoint();

// Do something

m_Connection.commit(); 
m_TransactionSave = null; 
m_Connection.setAutoCommit(true);
Run Code Online (Sandbox Code Playgroud)

如果我继续重新连接,或者使用像 PGBouncer 这样的连接池(就像有人在评论中建议的那样),我如何在它们之间保持这个事务?

java postgresql timeout jdbc

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

在构造函数中抛出异常是明智的吗?

我正在构建DB类,在构造函数中我想与数据库建立连接,以便该类中的其余函数可以访问静态dbLink.这是一个好方法吗?

java architecture jdbc

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

如何在JSP/Servlet中重用数据库连接?

目前,我正在每个JSP/Servlet中反复创建数据库连接.我想在我的JSP/Servlet项目中重用我的数据库连接.我怎样才能做到这一点?

java jsp servlets jdbc

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