Java SQL连接性能

Java SQL连接性能,java,database,connection,Java,Database,Connection,我正在尝试将组合模式的tomcat日志加载到MySQL数据库中,现在我在解析每个记录时将其推送到数据库中 首先,从InputStream中读取一行 然后将其解析为用于包装日志记录的LogItem 然后使用MySQLDbManager将记录插入数据库 MySQLDbManager持有数据库连接池的引用,一旦调用它来推送日志,它将请求一个连接来执行sql操作,然后释放它 我担心如果这是低性能的,因为MySQLDbManager将在日志推送期间始终获取并释放连接 我曾经想过制作一个列表来保存所有的登录

我正在尝试将组合模式的tomcat日志加载到MySQL数据库中,现在我在解析每个记录时将其推送到数据库中

首先,从InputStream中读取一行

然后将其解析为用于包装日志记录的LogItem

然后使用MySQLDbManager将记录插入数据库

MySQLDbManager持有数据库连接池的引用,一旦调用它来推送日志,它将请求一个连接来执行sql操作,然后释放它

我担心如果这是低性能的,因为MySQLDbManager将在日志推送期间始终获取并释放连接

我曾经想过制作一个列表来保存所有的登录项,在日志文件被读取后,我将这个列表传递给MySQLDbManager,但是日志文件可能拥有太多的记录,也就是说,它会导致一个登录项日志被放入列表中,这安全吗

这是两种方法:

MySQLDbManager dbm = MySQLDbManager.getInstance();
private void pushLogToDbByStream(BufferedReader br) {
    String line;
    int total = 0;
    int error = 0;
    try {
        while ((line = br.readLine()) != null) {
            LogItem li = LogParser.parser(line);        
            dbm.writeLogItemToDb(li);
            total++;
        }
    } catch (IOException e) {
        log.error("Error occur when read log from file");   
    } catch (IllegalStateException e) {
        error++;
        total++;
    }
    log.info(total + " items have been processed, " + error + " failed");
}

public int writeLogItemToDb(LogItem item) {
    //get a connect from the connect pool
    DBConnection dbc = pool.alloc();
    String insertSql = "insert into log values" + item.buildSQLInsertValues();
    //The buildSQLInsertValues() will return something like this--('127.0.0.1','GET','http://www.google.com'...)
    int res;
    try {
        res = dbc.updateSQL(insertSql);
        return res;
    } catch (SQLException e) {
        log.error("error occur when try to insert the item to db +\n" + insertSql + "\n");
        return 0;
    } finally {
        //release the connection
        pool.release(dbc);
    }
}
有更好的办法吗


顺便说一句,如果男生认为我的问题太简单而无法回答,你可以拒绝回答,但请不要投票否决我的帖子,我很难赢得声誉。:)

如果您使用的是连接池,那么“MySQLDbManager将在日志推送过程中始终获取并释放连接”就没有实际开销,因为您实际上不会为每个请求打开和关闭物理连接。这就是连接池的全部用途

此外,每当你担心某件事情会如何表现时,你能做的最好的事情就是自己测试它。编写一个快速测试台,看看这段代码有多快——每秒可以将多少日志推送到数据库?将100MB日志推送到数据库需要多长时间


只有通过实际测试代码,您才能确定答案。

是的,这是真的,我可以测试将日志推送到db所需的时间,但我不知道测试最多可以在列表或映射中放置多少对象,只需将对象放在它们上,直到系统本身停止工作?不管怎样,你的回答“你实际上不会为每个请求打开和关闭物理连接。”对我很有帮助。谢谢