重新连接到数据库后,如何在JDBC中重用Statement?

时间:2017-04-01 02:26:19

标签: java mysql jdbc

我与MySQL数据库的JDBC连接在10秒不活动后过期。重新连接后,我无法进行任何查询,它一直在问我是否要重新连接,就像连接仍然关闭一样。

我有:
 1.一个名为st,
的全球声明  2.一个名为rs的全局ResultSet,
 一个名为conn的全球联系,
 4.设置连接的方法setConnection,
 5.检查连接是否处于活动状态的方法checkConnection,如果不是,则调用setConnection方法建立新连接,
 6.一个调用checkConnection的按钮,如果返回的布尔值为true,则执行查询

private Connection conn = null;
private Statement st=null;
private ResultSet rs=null;

    public void setConnection(){
             host="localhost";
             database="test";
             username="testtest";
             password="testtest";
             String url = "jdbc:mysql://" + host + "/" +database+ "";
             try {
                 Class.forName ("com.mysql.jdbc.Driver");
                 conn = DriverManager.getConnection (url, username, password);
                 System.out.println("Succesfuly connected to the database!");

             } catch(Exception e){
                 System.out.println("Failed to connect to the database.");
                 e.printStackTrace();
             }  
        }

    private boolean checkConnection(){
            try {
                ResultSet cc = st.executeQuery("SELECT 1");
                return true;
            } catch (SQLException e) {
                int n = JOptionPane.showConfirmDialog(
                        frame,
                        "The connection was closed, reconnect?",
                        "Database security measure",
                        JOptionPane.YES_NO_OPTION);
                if(n == JOptionPane.YES_OPTION){
                    try {
                        conn.close();
                    } catch (SQLException e1) {
                        e1.printStackTrace();
                    }
                      setConnection();
                    } else if ( n == JOptionPane.NO_OPTION){
                        frame.setVisible(false);
                        new LoginWindowB();
                    }
                return false;
            }
        }
    btn1.addActionListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    if(checkConnection()){
                        try {
                            rs = st.executeQuery("SELECT * FROM " + selectedTable);
                            loadData(rs);

                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                    } else {

                    }
                }   
            });

如何处理此重新连接问题以及为什么查询在设置新连接后无效?

2 个答案:

答案 0 :(得分:1)

我不知道你在你的例子中初始化st的位置,但它闻起来像罪魁祸首。创建新连接时,还必须创建新语句。

所有PreparedStatement都附加到客户端,并将通过连接关闭。

使用连接池管理器库可能更容易。

答案 1 :(得分:1)

  

重新连接数据库后,如何在JDBC中重用Statement

你不能。

  

我有:   1.名为Statement

的全球st

错了。你不能拥有全局声明。语句与它们创建的连接是共同扩展的。你应该有一个本地变量`语句。它不可能是全球性的。

  
      
  1. 名为ResultSet
  2. 的全球rs   

再次错了。 ResultSet与其创建的Statement相同。它应该是一个局部变量。它不可能是全球性的。

  
      
  1. 一个名为conn的全局连接
  2.   

再次错了。您应该使用连接 pool ,并且拥有*本地变量conn

  
      
  1. 设置连接的方法setConnection
  2.   

再次错了。它应该是返回新连接的方法getConnection()

  
      
  1. 检查连接是否处于活动状态的方法checkConnection,如果不是,则调用setConnection方法建立新连接
  2.   

再次错了。甚至不应该存在这种方法。这是连接池的工作。

  
      
  1. 一个调用checkConnection的按钮,如果返回的布尔值为true,则执行查询
  2.   

再次错了。它应该是一个按钮:

  1. getConnection()
  2. 获取连接
  3. 使用Connection.createStatement()Connection.prepareStatement()
  4. 创建语句
  5. 执行语句,遍历ResultSet,并填充用结果行填充的任何内容。