打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Java JDBC效率:连接需要多长时间?

我仍在研究提到here的同样问题.它似乎工作正常,特别是在创建如下所示的AbstractModel类之后:

public abstract class AbstractModel {    protected static Connection myConnection = SingletonConnection.instance().establishConnection();    protected static Statement stmt;    protected static ResultSet rs;    protected boolean loginCheck;                   // if userId and userLoginHistoryId are valid - true, else false    protected boolean userLoggedIn;                 // if user is already logged in - true, else false    public AbstractModel (int userId, Long userLoginHistoryId){        createConnection();                                 // establish connection            loginCheck = false;        userLoggedIn = false;        if (userId == 0 && userLoginHistoryId == 0){        // special case for login            loginCheck = true;                              // 0, 0, false, false            userLoggedIn = false;                           // set loginCheck to true, userLogged in to false        } else {            userLoggedIn = true;            try{                String query = "select \"user_login_session_check\"("   userId   ", "   userLoginHistoryId   ");";                System.out.println("query: "   query);                stmt = myConnection.createStatement();                rs = stmt.executeQuery(query);                while (rs.next()){                    loginCheck = rs.getBoolean(1);                }            } catch (SQLException e){                System.out.println("SQL Exception: ");                e.printStackTrace();            }        }    }    // close connection    public void closeConnection(){        try{            myConnection.close();        } catch (SQLException e){            System.out.println("SQL Exception: ");            e.printStackTrace();        }    }    // establish connection    public void createConnection(){        myConnection = SingletonConnection.instance().establishConnection();    }    // login session check    public boolean expiredLoginCheck (){        if (loginCheck == false && userLoggedIn == true){            closeConnection();            return false;        } else {            return true;        }    }}

我已经在上面问题的链接中发布了存储过程和Singleton Pattern实现.

我的印象是,在每次单个数据事务之后,我不需要关闭与数据库的连接,因为它只会减慢应用程序的速度.我正在为我正在构建的这个系统寻找大约30个用户,因此性能和可用性非常重要.

延长至少3-4次数据交易的连接是否正确?例如.验证检查某些表单的用户输入,或类似于谷歌的自动建议…这些都是基于用户输入的单独存储的函数调用.我可以使用一个连接实例,而不是在每次数据事务后连接和断开连接吗?哪个更有效率?

如果我的假设是正确的(使用一个连接实例更有效),那么应该在控制器中处理连接的打开和关闭,这就是我创建createConnection()和closeConnection()方法的原因.

谢谢.

解决方法:

像Tomasz说的那样,你永远不应该依赖于你的应用程序将被少数客户使用的事实.在一定时间后驱动程序将超时的事实并不能保证您将拥有足够的可用连接.想象一下:很多数据库预先配置了最大连接数设置为(比如说)15和超时(比方说)10-15分钟.如果你有30个客户端,并且每个客户端都进行了一次操作,那么在中途的某个地方你就会遇到连接问题.

您应该通过以下方式处理连接,文件,流和其他资源:

public void doSomething(){    Connection connection = null;    Statement stmt = null;    ResultSet rs = null;    final String sql = "SELECT ....");    try    {        connection = getConnection();        stmt = connection.createStatement();        rs = stmt.executeQuery(sql);        if (rs.next())        {            // Do something here...        }    }    catch (SQLException e)    {        e.printStackTrace();    }    finally    {        closeResultSet(rs);        closeStatement(stmt);        closeConnection(connection);    }}

try / catch / finally保证无论结果如何,连接都将被关闭.如果出现某种类型的故障,那么finally块仍将关闭连接,就像它可以做的那样,如果事情还可以的话.

同样,对于文件和流,您需要执行相同的操作.在try / catch / finally之外将相应对象初始化为null,然后按照上面的方法操作.

这种误解使得许多Java应用程序在Windows下行为不端,人们不会关闭文件(流到文件等)并且这些文件被锁定,迫使你要么杀掉JVM,要么重启你的机器.

您也可以使用连接池,例如Apache的DBCP,但即使这样,您也应该关闭资源,尽管在内部,不同的连接池实现不一定会关闭连接.

来源:http://www.icode9.com/content-1-245801.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
如何把log4j中的message信息存储到数据库中 DataBase
java连接Oracle数据库的工具类
JAVA基础:将数据库操作封装到Javabean
用JAVA从数据库中读出字段及内容
JSP如何保存用户上次登录时间
欢迎光临 - 琳婕小筑-老猫的理想 - JSP中SQL数据库编程技术 -
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服