Java 在重新连接到数据库后,如何重用JDBC中的语句?

Java 在重新连接到数据库后,如何重用JDBC中的语句?,java,mysql,jdbc,Java,Mysql,Jdbc,我与MySQL数据库的JDBC连接在10秒不活动后过期。在我重新连接之后,我无法进行任何查询,它一直在问我是否要重新连接,就好像连接仍然关闭一样 我有: 1.一个名为st的全局语句, 2.名为rs的全局结果集, 3.称为conn的全局连接, 4.设置连接的方法setConnection, 5.checkConnection方法,用于检查连接是否处于活动状态,如果未处于活动状态,则调用setConnection方法以建立新连接, 6.调用checkConnection的按钮,如果返回的布尔值为tr

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

我有:
1.一个名为st的全局语句,
2.名为rs的全局结果集,
3.称为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 {

                    }
                }   
            });

我如何处理这个重新连接问题,以及为什么在建立新连接后查询不起作用?

在您的示例中,我看不出您在哪里初始化
st
,但它闻起来像是罪魁祸首。创建新连接时,还必须创建新语句

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

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

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

你不能

我有: 1.一个名为
st

已经错了。不能有全局语句。语句与创建它们的连接是同延的。应该有一个局部变量`语句。它不可能是全球性的

  • 一个名为
    rs
  • 又错了。
    ResultSet
    与从中创建它的
    语句同时终止。它应该是一个局部变量。它不可能是全球性的

  • 一个名为conn的全局连接
  • 又错了。您应该使用连接池,并具有*局部变量
    conn

  • 设置连接的方法
    setConnection
  • 又错了。它应该是一个返回新连接的方法
    getConnection()

  • checkConnection方法,用于检查连接是否处于活动状态,如果未处于活动状态,则调用setConnection方法以建立新连接
  • 又错了。这种方法甚至不应该存在。这是连接池的作业

  • 调用checkConnection的按钮,如果返回的布尔值为true,则执行查询
  • 又错了。它应该是一个按钮,用于:

  • getConnection()
  • 使用
    Connection.createStatement()或
    Connection.prepareStatement()创建语句
  • 执行语句,遍历
    结果集
    ,并用结果行填充它必须填充的内容

  • 您的代码片段不够完整,无法进行分析。您没有显示语句对象的初始化或处理,这在这里可能很重要。您还没有包括问题的细节(例如堆栈跟踪),这将有助于进一步查明手头的问题。实际上,从您的回答中,我找到了解决方案。st只初始化了一次,当我重新连接时,它没有再次初始化它。在调用setConnection()之后,我添加了st inside checkconnection的初始化;方法和它完美的工作。是的,这正是我所说的。。。很高兴你找到了答案。