web项目,批处理代码,求修改。

lxpandsq 2012-07-31 11:55:43


String sq1="select * from HrEmployee where cardid in("+sa+")";
String sq2="select * from EquFinger where cardid in("+sa+")";
String sq3="select * from EquCard where cardid in("+sa+")";

String st1[][]=msql.executeQuery(sq1,strDB1);
String st2[][]=msql.executeQuery(sq2,strDB1);
String st3[][]=msql.executeQuery(sq3,strDB1);



String sqla0="insert into HrEmployee(EmplID,WorkID,CardID,DeptID,EmplName,Sex,EntryDate,LeaveYN,LastOperId,LastOperDate ) values (?,?,?,?,?,?,?,?,?,?)";

String sqla1="insert into EquFinger (EmplID,CardNo,BackupID,Privilege,pws ) values (?,?,?,?,?)";

String sqla2="insert into EquCard (CardNo,EmplID,CardType,CardStatus ) values (?,?,?,?)";

PreparedStatement psStatementin=msql.executeUpdate(sqla0,strDB2);

for(int i=0;i<st1.length;i++)
{

psStatementin.setString(1,st1[i][0]);
psStatementin.setString(2,st1[i][1]);
psStatementin.setString(3,st1[i][2]);
psStatementin.setString(4,st1[i][3]);
psStatementin.setString(5,st1[i][4]);
psStatementin.setString(6,st1[i][5]);
psStatementin.setString(7,st1[i][6]);
psStatementin.setString(8,st1[i][7]);
psStatementin.setString(9,st1[i][8]);
psStatementin.setString(10,st1[i][9]);

psStatementin.addBatch();
}
psStatementin.executeBatch();
msql.close();

PreparedStatement psStatementin1=msql.executeUpdate(sqla1,strDB2);

for(int i=0;i<st2.length;i++)
{

psStatementin1.setString(1,st2[i][0]);
psStatementin1.setString(2,st2[i][1]);
psStatementin1.setString(3,st2[i][2]);
psStatementin1.setString(4,st2[i][3]);
psStatementin1.setString(5,st2[i][4]);

psStatementin1.addBatch();
}
psStatementin1.executeBatch();
msql.close();


PreparedStatement psStatementin2=msql.executeUpdate(sqla2,strDB2);

for(int i=0;i<st3.length;i++)
{

psStatementin2.setString(1,st3[i][0]);
psStatementin2.setString(2,st3[i][1]);
psStatementin2.setString(3,st3[i][2]);
psStatementin2.setString(4,st3[i][3]);
psStatementin2.addBatch();
}
psStatementin2.executeBatch();
msql.close();




排版有点乱,两个疑问,一个希望
1.那个close是关闭数据库连接的,核心代码,就是Connection 对象调用close()方法,我想问的是,用的着这样,关闭3次吗?
2.三次批处理,用了3个PreparedStatement对象,我想问,可以将这个对象反复使用吗?使用把它初始化成什么比较合理。
3.谁能帮我优化下,这批处理代码。谢谢
...全文
111 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
z_yes163 2012-08-01
  • 打赏
  • 举报
回复
1.那个close是关闭数据库连接的,核心代码,就是Connection 对象调用close()方法,我想问的是,用的着这样,关闭3次吗?>>>>>>可以只关闭一次 你把Connection 提成似有全全局成员变量 只初始化一次 可以用构造方法或者是set 方法
2.三次批处理,用了3个PreparedStatement对象,我想问,可以将这个对象反复使用吗?使用把它初始化成什么比较合理。 PreparedStatement 可以反复使用 java 是从前到执行的,前面用完 后面有重新赋值 和你构造一个新对象有什么区别。

最后关于关闭的 问题 你可以抽出 一个公共关闭方法 在 finally 调用 ,或者你直接用框架 比喻spring之类的 自动管理事物。
lxpandsq 2012-07-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
msql.close();

PreparedStatement psStatementin1=msql.executeUpdate(sqla1,strDB2);

关闭了数据库连接,后面又使用这个连接,肯定报错了
[/Quote]
错是没错的,因为获取连接,实在另外一个类里面,就是msql.executeQuery(sq1,strDB1);
只是我感觉,返回获取和关闭是否,是必须的,还有PreparedStatement这个对象,真的需要反复申请吗?不能赋值的方式,使用同一个这个对象吗?
lip009 2012-07-31
  • 打赏
  • 举报
回复

try{
//数据库操作代码
...
...

}catch(Exception e){
//出现异常时回滚数据库操作
msql.rollback();
}finally{
//关闭数据库资源
if(psStatementin!=null){
psStatementin.close();
psStatementin=null;
}
if(psStatementin1!=null){
psStatementin1.close();
psStatementin1=null;
}
if(psStatementin2!=null){
psStatementin2.close();
psStatementin2=null;
}
if(msql!=null && !msql.isClose()){
msql.close();
msql=null;
}
}
lip009 2012-07-31
  • 打赏
  • 举报
回复
msql.close();

PreparedStatement psStatementin1=msql.executeUpdate(sqla1,strDB2);

关闭了数据库连接,后面又使用这个连接,肯定报错了
lip009 2012-07-31
  • 打赏
  • 举报
回复
一次完整的业务操作一个连接,不是整个web
lxpandsq 2012-07-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
引用 4 楼 的回复:

引用 2 楼 的回复:
msql.close();

PreparedStatement psStatementin1=msql.executeUpdate(sqla1,strDB2);

关闭了数据库连接,后面又使用这个连接,肯定报错了

错是没错的,因为获取连接,实在另外一个类里面,就是msql.executeQuery(sq1,strDB1);
……
[/Quote]

您的意思是,我整个web,只用获取一次连接,就好?而不是我现在这样,用一次,开一次,关一次?
lip009 2012-07-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 2 楼 的回复:
msql.close();

PreparedStatement psStatementin1=msql.executeUpdate(sqla1,strDB2);

关闭了数据库连接,后面又使用这个连接,肯定报错了

错是没错的,因为获取连接,实在另外一个类里面,就是msql.executeQuery(sq1,strDB1);
只是我感觉,返回获取和关闭……
[/Quote]

数据库连接只需要一个就可以,
PreparedStatement必须一次操作使用一个,因为PreparedStatement必须在使用完后close,否则会造成内存泄露。
本课程为Django第九季课程:Web项目发布到腾讯云     本季课程主要Web项目发布到腾讯云,内容包含:Web项目发布的总体介绍、simple_server、WSGI协议、uWSGI服务器、发布成功后的整体架构、源码发布前的基本配置、使用Git把代码发布到Gitee、腾讯云主机的购买和初始化、准备腾讯云主机的mysql数据库环境、准备腾讯云主机redis数据库环境、准备腾讯云主机的Python运行环境、完成云主机的数据和运行测试、安装并配置uWSGI服务器、安装并配置Nginx服务器等等内容。      本案例完整的演示了项目实现过程,虽然不复杂,但涉及的内容非常多,特别是前后端交互的时候,有诸多的坑等着你去踩,好在王老师全程代码呈现,带着大家一起填坑,大大提高学习效率的同时,也培养了大家良好的代码习惯,希望大家一起跟着王进老师学习Python开发。 课程目标:本系列课程是从零基础开始并深入讲解Django,最终学会使用Django框架开发企业级的项目。课程知识点详细,项目实战贴近企业需。本系列课程除了非常详细的讲解Django框架本身的知识点以外,还讲解了web开发中所需要用到的技术,学完本系列课程后,您将独立做出一个具有后台管理系统,并且前端非常优美实用的网站。对于从事一份Python Web开发相关的工作简直轻而易举。 

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧