下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.导致服务器死机的原因有很多 现在慢慢罗列:1. 数据库连接没释放 或者 JDBC操作类写得不够好 没有及时释放连接 数据库连接对象指的是 Connection, PreparedStatement, ResultSet 把他们搬回到局部变量中去,老老实实地采用最为普通办法。 你的这个所谓的数据库连接文件,有大量的地方需要改动。1,DataSource 可以弄成成员变量,因为这个从 JNDI 上得到的实例只要实例化一次就行了;2,不要把数据库连接对象当作是普通变量传来传去的,标准的做法应该是这样的: public List getAllStudents() Connection con = n
2、ull; PreparedStatement ps = null; ResultSet rs = null; List students = new ArrayList(); try con = ConnectionFactory.getConnection(); String sql = SELECT s.id, , s.age FROM Student s ; ps = con.prepareStatement(sql); rs = ps.executeQuery(); while(rs.next() Student stu = new Student(); stu.setId
3、(rs.getInt(id); stu.setName(rs.getString(name); stu.setAge(rs.getInt(age); students.add(stu); catch(SQLException e) . finally JdbcUtil.close(rs, ps, con); return students;数据库连接资源是竞争度最高的资源,这个资源是非常宝贵的,必须使用完成后立即将其关闭(还回连接池中),相对于数据库连接资源而已,局部变量的创建可以忽略不计,由于定义是局部变量,因此也不存在线程安全的问题。定义成局部变量可以让需要连接的时候立刻获得连接,用完之后
4、立即关闭,根本不会出现像楼主那种占用 160 多个连接的状况。2. 对程序操作的优化 pojo 操作数据库的粒度 首先得弄清楚,做的是应用程序,也就是在操作数据库的最小粒度应定为 POJO 的对象,而不是数据库连接对象。实际上指的就是:如果要通过学号查找学生的姓名,我们的方法很可能会定义成这样:public String getStudentNameBySno(Integer sno);这样的操作粒度就不是一个 POJO 对象,而是 POJO 对象中的一个属性,这样的方法非常不灵活,比如改天要增加一个通过学号获得这个学生的数学成绩呢?所以应该把方法定义成这样:public Student ge
5、tStudentBySno(Integer sno);这样所实现的最小粒度就是个 POJO 对象。当然了,我们操作的应是 POJO 对象,如果不是做类库设计的话,严禁把数据库连接对象通过方法传来传去的。3.参考一下几点找出原因1. 连接池,推荐,配置一下就可以,简单。2. 缓存,涉及到你具体的业务逻辑,3. 记录慢查询,做针对性的优化,如索引等4. 如果是网站,部分访问量较高,变化不大的页面可以做静态化。根据你说的情况,建议优化顺序:1 - 3 - 2 - 4最主要是先找到慢的原因。4对一般JavaBean及一些代码的优化对JavaBean的优化:(1)尽量使用final修饰符定义类。被fin
6、al修饰的泪是不可派生的,并且意味着该类中的所有方法被final修饰。在这种情况下,Java编译器会内联(inline)所有被final修饰的方法,这将大大提升软件性能。(2)尽量使用局部变量。方法的入口参数和方法中的临时变量都保存在栈(Stack)中,速度较快。而其他变量,如静态变量和实例变量,都保存在堆(Heap)中,速度较慢。(3)避免在同一个类中通过调用函数或方法访问变量。例如:public class Test private int value; public int getValue() return value; public int setValue(int value) t
7、his.value = value; public void print() this.setValue(16); System.out.println(this.getValue); 建议修改为:public class Test private int value; public int getValue() return value; public int setValue(int value) this.value = value; public void print() value = 16; System.out.println(value); (4)尽可能的使用static、fi
8、nal、private等关键字。楼主可以参考以上所说对代码进行修改,如有不足之处还请多多包含5.查询sql语句执行的效率 用这句 select * from v$open_cursor 查询Oracle正在执行的进程的SQL。然后查看分析是哪个语句占用时间最长,找出问题。通常是应用程序的问题引起执行效率低,例如报表的查询,允许用户查询1年的数据,有可能该查询语句的执行需要60秒的时间,若同时有多个用户进行该项查询的操作,数据库的性能是会急剧下降的。改为限制只能查询1个月的限制,可提高效率。但也不排除连接池在异常情况下连接未能正确释放的可能。6.JDK版本问题 涉及到内存泄露 楼上的兄弟都不失为考虑的因素和优化方案。个人提出个可能:JDK(son公司)版本不稳定,也会导致系统变慢,甚至会内存溢出问题。数据库连接数有增无减,即使在连接池中加入了释放连接也没用。原因是JDK内部出现异常,虽然程序中释放了内存和连接,但Tomcat服务器中却没有,而且自动回收速度较慢,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论