数据库交互情况下捕获lambda模式对java性能的影响
我使用lambdas来确保关闭结果集和数据库连接 在我下面的代码中,我捕获了一些变量,如(activeList、inActiveList、user)。在许多地方,虽然链接(一次性成本)和调用成本对于捕获和非捕获lambda是相似的,但是由于中间的“捕获成本”,捕获lambda没有性能。每次调用时都需要创建lambda对象。对于非捕获lambda,它是一次性的,然后后续调用将重用同一对象。但是为了在每次创建对象时捕获lambda 我在下面添加了我的代码片段。这种类型的捕获lambda在我的web应用程序代码中更常见。我的假设是,由于为每个请求执行的select查询的数量相对较低,所以使用这种类型的捕获lambda不会对性能产生显著影响。是正确的,还是我做错了数据库交互情况下捕获lambda模式对java性能的影响,java,database,performance,lambda,resultset,Java,Database,Performance,Lambda,Resultset,我使用lambdas来确保关闭结果集和数据库连接 在我下面的代码中,我捕获了一些变量,如(activeList、inActiveList、user)。在许多地方,虽然链接(一次性成本)和调用成本对于捕获和非捕获lambda是相似的,但是由于中间的“捕获成本”,捕获lambda没有性能。每次调用时都需要创建lambda对象。对于非捕获lambda,它是一次性的,然后后续调用将重用同一对象。但是为了在每次创建对象时捕获lambda 我在下面添加了我的代码片段。这种类型的捕获lambda在我的web应
User user = getUser(id);
List<Integer> activeList = new ArrayList<>();
List<Integer> inActiveList = new ArrayList<>();
HashMap<String, Object> h = new HashMap<>();
DBUtil.execute(sqlQuery (rs) -> {
String id = rs.getString("id");
h.put("id", id)
h.put("name", rs.getString("name"));
if(user.isAdmin()){
h.put("pay", re.getInt("pay"))
}
int status = rs.getInt("status");
if(status == 1){
activeList.add(id);
} else if(status == 2){
inActiveList.add(id);
}
})
User-User=getUser(id);
List activeList=new ArrayList();
List inActiveList=new ArrayList();
HashMap h=新的HashMap();
DBUtil.execute(sqlQuery(rs)->{
字符串id=rs.getString(“id”);
h、 put(“id”,id)
h、 put(“name”,rs.getString(“name”);
if(user.isAdmin()){
h、 出售(“支付”,再出售(“支付”))
}
int status=rs.getInt(“status”);
如果(状态==1){
activeList.add(id);
}否则如果(状态==2){
不活动列表。添加(id);
}
})
static void execute(字符串sql,使用者迭代器fn){
试一试{
连接conn=getConn();
语句stmt=conn.createStatement(sql)
结果集rs=stmt.executeQuery(sql);
while(rs.next()){
迭代器fn.accept(rs);
}
rs.close();
}最后{
如果(stmt!=null){
stmt.close()
}
如果(conn!=null){
康涅狄格州关闭
}
}
}
参考文献
为什么不尝试使用资源?执行()将在我的代码中的许多地方被调用。在可读性和易写性方面,使用lambda比在我执行查询的所有地方尝试使用资源要好。我没有硬性数字,但我甚至不敢认为捕获lambda成本会对DB调用产生任何远程明显的影响。您将一些指令和内存负载与ConnPool采集(同步)、至少一个网络往返(可能更多)DB、语句缓存和编译成本以及查询执行时间和数据序列化进行比较。我真的没有数字,但我敢打赌你是在比较10秒的纳秒和10秒的毫秒。所以在信封的背面:两者之间有100万个因素。尽管如此,我还是希望看到真实的数据!问题不在于连接池或往返。我的代码是解释我的用例,并给出一些关于调用频率和调用时间的上下文。我的问题是,使用捕获lambda来读取select查询的结果是否合适。请注意,真正的问题是程序员花了太多时间在错误的地点和错误的时间担心效率;过早优化是编程中所有罪恶(或至少大部分)的根源。[Donald E.Knuth,《计算机编程作为一门艺术》(1974年)]
static void execute(String sql, Consumer<ResultSet> iteratorFn) {
try {
Connection conn = getConn();
Statement stmt = conn.createStatement(sql)
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
iteratorFn.accept(rs);
}
rs.close();
} finally {
if(stmt != null){
stmt.close()
}
if(conn != null){
conn.close()
}
}
}