【问题标题】:same method to get connection from DB but takes different time in visualvm从数据库获取连接的方法相同,但在visualvm中需要不同的时间
【发布时间】:2016-10-18 22:44:37
【问题描述】:

我有一种从数据库获取连接的方法。我使用 visualvm 运行探查器。我发现我第一次调用从数据库获取连接的方法比其他方法花费的时间更长。

如何避免多次获取数据库连接?

【问题讨论】:

标签: java sql sql-server performance sql-server-2008


【解决方案1】:

java servlet 或 java program 或 application server 无关紧要,这只是一个设计理念。 这是一个简单的demo,我用的是MySQL,希望能解释一下这个设计思路:

类 MyConnection:

package mysql;

import java.sql.Connection;

public class MyConnection {

    private Connection connection;

    private boolean isUsed;

    public void setConnection(Connection connection) {
        this.connection = connection;
    }

    public void setUsed(boolean isUsed) {
        this.isUsed = isUsed;
    }

    public Connection getConnection() {
        return connection;
    }

    public boolean isUsed() {
        return isUsed;
    }

}

类 MyConnectionPool:

 package mysql;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class MyConnectionPool {
    //this pool will hold the connection 
    static List<MyConnection> connectionPool = new ArrayList<>();

    public MyConnectionPool() {
        String mysqlConfigString = "jdbc:mysql://IP:3306/dbname?user=username&password=password";
        int size = 0;
        while (size++ < 10) {
            Connection conn;
            try {
                conn = DriverManager.getConnection(mysqlConfigString);
                MyConnection myConnection = new MyConnection();
                myConnection.setConnection(conn);
                myConnection.setUsed(false);
                connectionPool.add(myConnection);
            } catch (SQLException e) {
                e.printStackTrace();
            }

        }
    }

    public MyConnection getConnection(){
        for (MyConnection myConnection : connectionPool) {
            if(myConnection.isUsed()){
                System.out.println("connection is used");
                continue;
            }
            myConnection.setUsed(true);
            return myConnection;
        }
        return null;
    }

}

类测试:

package mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class MysqlTest {

    public static void main(String[] args) throws SQLException {
        MyConnectionPool pool = new MyConnectionPool();

        // connection one
        MyConnection myConnection = pool.getConnection();
        Connection conn = myConnection.getConnection();
        PreparedStatement ps = conn.prepareStatement("select count(*) as co from asset");
        ResultSet rs = ps.executeQuery();
        rs.next();
        System.out.println(rs.getString("co"));
        ps.close();

        // connection tow
        myConnection = pool.getConnection();
        conn = myConnection.getConnection();
        ps = conn.prepareStatement("select count(*) as co from asset");
        rs = ps.executeQuery();
        rs.next();
        System.out.println(rs.getString("co"));

        // connection three
        myConnection = pool.getConnection();
        conn = myConnection.getConnection();
        ps = conn.prepareStatement("select count(*) as co from asset");
        rs = ps.executeQuery();
        rs.next();
        System.out.println(rs.getString("co"));
        //reset connection use status
        myConnection.setUsed(false);

        // re-use connection three
        myConnection = pool.getConnection();
        conn = myConnection.getConnection();
        ps = conn.prepareStatement("select count(*) as co from asset");
        rs = ps.executeQuery();
        rs.next();
        System.out.println(rs.getString("co"));
    }

}

因为我从不关闭MyConnectionPool中的connection,所以我可以重新使用connection。

这是一个非常简单的演示。真正的连接池非常复杂。 您可以找到一些连接池 jar。

不知道你选择什么ORM框架,流行的ORM框架都支持Database Connection Pool。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 2017-06-19
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多