Java 线程处的NullPointerException

Java 线程处的NullPointerException,java,Java,我正在编写一个Java应用程序,该应用程序对从文本文件读取的TCAP帧进行解码,然后将解码后的数据插入数据库(Oracle)!因此,在开始时,解码和集成可以完美地执行,但当它达到有限数量的解码和插入数据时,它会在假设插入数据库的线程处开始触发此错误: " java.lang.OutOfMemoryError: unable to create new native thread " " Exception in thread "Thread-465" java.lang.NullP

我正在编写一个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); 
    }
} 

有人有办法解决这个问题吗?

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

p、 当您重用线程时,不要在run方法中创建连接,您不必每次都重新创建连接

阅读有关


请参见本节开头的陈述

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();
} 

一旦所有线程都执行完毕,关闭连接。

您可以粘贴任何代码吗?您的问题似乎是
OutOfMemoryError
而不是
NullPointerException
@user2165627请将其添加到问题中并适当格式化。这是线程的运行方法,你能给我们看一下实例化线程的代码吗?您是将线程合用还是在循环中一次又一次地创建它们?@user2165627这正是您的问题所在
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();
}