【问题标题】:JDCBC connection error with Jmeter testJmeter测试的JDBC连接错误
【发布时间】:2016-02-13 22:02:18
【问题描述】:

我尝试使用 Jmeter 来强调我的应用程序。当我不同步我的两种方法时,我有多个错误,如下所示:

语句已关闭。 或

22:43:40,669 ERROR [stderr] (http-localhost-127.0.0.1-8080-106) java.sql.SQLException: Error
22:43:40,669 ERROR [stderr] (http-localhost-127.0.0.1-8080-106)     at org.jboss.jca.adapters.jdbc.WrappedConnection.checkException(WrappedConnection.java:1643)
22:43:40,670 ERROR [stderr] (http-localhost-127.0.0.1-8080-106)     at org.jboss.jca.adapters.jdbc.WrappedStatement.checkException(WrappedStatement.java:1262)
22:43:40,670 ERROR [stderr] (http-localhost-127.0.0.1-8080-106)     at org.jboss.jca.adapters.jdbc.WrappedResultSet.checkException(WrappedResultSet.java:4063)
22:43:40,670 ERROR [stderr] (http-localhost-127.0.0.1-8080-106)     at org.jboss.jca.adapters.jdbc.WrappedResultSet.next(WrappedResultSet.java:1866)
22:43:40,671 ERROR [stderr] (http-localhost-127.0.0.1-8080-106)     at fr.formation.dao.DaoImpl.getAllPersonnes(DaoImpl.java:275)

 java.sql.SQLException: The result set is closed.

 Caused by: java.lang.NullPointerException
22:43:40,992 ERROR [stderr] (http-localhost-127.0.0.1-8080-73)  at com.mysql.jdbc.ResultSetImpl.checkColumnBounds(ResultSetImpl.java:825)
22:43:40,993 ERROR [stderr] (http-localhost-127.0.0.1-8080-73)  at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2710)
22:43:40,993 ERROR [stderr] (http-localhost-127.0.0.1-8080-73)  at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2846)
22:43:40,993 ERROR [stderr] (http-localhost-127.0.0.1-8080-73)  at org.jboss.jca.adapters.jdbc.WrappedResultSet.getInt(WrappedResultSet.java:1073)
22:43:40,993 ERROR [stderr] (http-localhost-127.0.0.1-8080-73)  ... 23 more
22:43:40,993 ERROR [stderr] (http-localhost-127.0.0.1-8080-184) java.sql.SQLException: The result set is closed.
22:43:40,994 ERROR [stderr] (http-localhost-127.0.0.1-8080-184)     at org.jboss.jca.adapters.jdbc.WrappedResultSet.checkState(WrappedResultSet.java:4081)
22:43:40,994 ERROR [stderr] (http-localhost-127.0.0.1-8080-184)     at org.jboss.jca.adapters.jdbc.WrappedResultSet.getInt(WrappedResultSet.java:1065)

我的代码:

public  List<PersonneDao> getAllPersonnes() throws SQLException{
        List<PersonneDao> liste = new ArrayList<PersonneDao>();
          ResultSet rs = null ;
          PreparedStatement preparedStatement = null;
          try {

                connection =  ConnectionUtil.getInstance().getConnection();
                preparedStatement = (PreparedStatement) connection.prepareStatement("select * from personne");
                 rs = preparedStatement.executeQuery();



                while (rs.next()) {
                PersonneDao user = new PersonneDao();
                    user.setId (rs.getInt("id"));
                    user.setNom (rs.getString("nom"));
                    user.setPrenom(rs.getString("prenom"));
                    user.setEmail(rs.getString("email"));

                    liste.add(user);

                }

                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }finally{

                if (rs != null) {
                    try {
                        rs.close();
                    } catch (SQLException sqlex) {
                        // ignore, as we can't do anything about it here
                    }

                    rs = null;
                }

                if (preparedStatement != null) {
                    try {
                        preparedStatement.close();
                    } catch (SQLException sqlex) {
                        // ignore, as we can't do anything about it here
                    }

                    preparedStatement = null;
                }

                if (connection != null) {
                    try {
                        ConnectionUtil.getInstance().close(connection);
                    } catch (SQLException sqlex) {
                        // ignore, as we can't do anything about it here
                    }

                    connection = null;


                }
            }
        return liste;

    }

}

public class ConnectionUtil {

    private DataSource dataSource;

    private static ConnectionUtil instance = new ConnectionUtil();

    private ConnectionUtil() {
        try {
            Context initContext = new InitialContext();
            dataSource = (DataSource) initContext.lookup("java:/dsFormationJSP");
        } catch (NamingException e) {
            e.printStackTrace();
        }
    }

    public static ConnectionUtil getInstance() {
        return instance;
    }

    public Connection getConnection() throws SQLException {
        Connection connection = dataSource.getConnection();
        return connection;
    }

    public void close(Connection connection) throws SQLException {
        if (connection != null && !connection.isClosed()) {
            connection.close();
        }
        connection = null;
    }

}

我在这个配置中使用 Jboss AS 7.1

  <datasource jta="false" jndi-name="java:/dsFormationJSP" pool-name="dsFormationJSP" enabled="true" use-ccm="false">
                    <connection-url>jdbc:mysql://localhost:3306/base_personne</connection-url>
                    <driver-class>com.mysql.jdbc.Driver</driver-class>
                    <driver>mysql-connector-java-5.1.30-bin.jarcom.mysql.jdbc.Driver_5_1</driver>
                    <pool>
                        <min-pool-size>50</min-pool-size>
                        <max-pool-size>70</max-pool-size>
                        <prefill>true</prefill>
                    </pool>
                    <security>
                        <user-name>root</user-name>
                        <password>root</password>
                    </security>
                    <validation>
                        <validate-on-match>false</validate-on-match>
                        <background-validation>false</background-validation>
                    </validation>
                    <timeout>
                        <blocking-timeout-millis>50000</blocking-timeout-millis>
                        <idle-timeout-minutes>5</idle-timeout-minutes>
                    </timeout>
                    <statement>
                        <share-prepared-statements>false</share-prepared-statements>
                    </statement>
                </datasource>

当我同步这两种方法时,就可以了。我通常不需要这样做(它是数据库和 jboss 的本机机制)。感谢您的帮助。

【问题讨论】:

  • 请使用适当的语言进行标记,这里是java,以便您的代码和响应者的代码可以适当地颜色格式。
  • 同步哪2个方法?

标签: java performance jdbc


【解决方案1】:

看起来getAllPersonnes() 中的connection 是一个字段,而不是局部变量。这意味着当同时运行时,一个执行可能会覆盖另一个执行的连接,这可能导致两个执行使用相同的连接。

例如:

  • Thread1 设置connection,
  • Thread2 设置connection,
  • Thread1 准备语句(连接由 Thread2 设置!),
  • Thread2 准备语句,

哪个方法完成首先关闭连接,然后另一个完成。关闭连接会关闭依赖语句和结果集,从而导致错误。

你需要将connection改成方法内部的一个局部变量,这样就不能被其他线程覆盖了。

【讨论】:

  • 谢谢。我更改代码并在我的方法中获得连接: Connection connection= ConnectionUtil.getInstance().getConnection();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-31
  • 2020-04-26
  • 2015-07-09
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
相关资源
最近更新 更多