-1

我正在编写 Java 应用程序来解码将从文本文件中读取的 TCAP 帧,然后将解码后的数据插入数据库(Oracle)中!因此,一开始解码和集成是完美执行的,但是当它达到有限数量的解码和插入数据时,它开始在假定插入数据库的线程上触发此错误:

   " java.lang.OutOfMemoryError: unable to create new native thread "
    " Exception in thread "Thread-465" java.lang.NullPointerException "

代码摘录:

public void run(){ 
    Conn_BD connexion=new Conn_BD("thin:@localhost:1521:XE", "SYSTEM", "SYSTEM");     
    java.sql.Connection cn=connexion.connect(); 
    try { 
        Statement instruction = cn.createStatement(); 
        instruction.executeUpdate("update tcapBegin set "+ 
            trame+"='"+trame_val+"' where "+message+" like '"+trameId+"'"); 
        cn.close(); 
    } catch(SQLException e) { 
        System.out.print(e); 
    }
} 

有没有人有解决这个问题的想法?

4

2 回答 2

2

与其为每个插入(或您执行的任何其他操作)实例化一个线程,不如尝试创建一个“任务”队列,每个任务将代表一个这样的线程应该执行的插入。当你有这样一个队列时,你需要有一个线程将任务“推送”到队列中,以及通过将它们“拉”出队列并执行它们来执行实际任务的线程。通过这种方式,您将不需要每个任务一个线程,而是可以使用一小组通用线程,这些线程将从队列中获取任务,执行它,然后返回队列以进行更多工作。

ps当你重用你的线程时,不要在run方法中创建连接,你不必每次都重新创建连接。

阅读有关Executors 和 Thread Pooling
的 信息 请参阅Producer Consumer
请参阅DB Connection pooling

于 2013-03-13T14:13:11.310 回答
0

你在 trhead 的开头有这个声明

Conn_BD connexion=new Conn_BD("thin:@localhost:1521:XE", "SYSTEM", "SYSTEM"); 

似乎每次创建新线程时您都在创建新连接。创建一个连接然后执行语句需要时间,所以当你的第一个连接关闭时,已经创建了很多其他连接,你不能再创建了。

如果您使用一个静态参考进行连接,则更好的选择是。

private static Conn_BD connexion=new Conn_BD("thin:@localhost:1521:XE", "SYSTEM", "SYSTEM");     
private static java.sql.Connection cn=connexion.connect();
public void run(){
Statement instruction = cn.createStatement();
//code here 
instruction.close();
} 

一旦所有线程完成执行关闭连接。

于 2013-03-13T14:14:50.020 回答