我的数据库中有2500万条记录,我希望使用java.my连接在5000条记录后终止它。我该怎么做才能保持我的联系活着
package spliting;
import java.sql.*;
import java.util.ArrayList;
public class SpaceSpliting {
public Connection getConnection()
{
Connection con=null;
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","abc","abc");
}
catch(Exception e)
{
System.out.println(e);
}
return con;
}
public void addingValues()
{
int m=0,kk=0;
try
{
Connection con=getConnection();
Statement st=con.createStatement();
ResultSet rs=st.executeQuery("select * from owner");
while(rs.next())
{
String model=rs.getString(2);
System.out.println(model);
if(model==null)
{
kk++;
System.out.println(0+" "+kk);
m++;
}
else
{
String[] amodel=model.split(" ");
System.out.println(amodel.length);
if(amodel.length==1)
{
System.out.println("1");
Statement st1=con.createStatement();
st1.executeUpdate("update owner set maker='"+amodel[0]+"'where model_desc='"+model+"'");
kk++;
System.out.println("records updated"+" "+kk);
}
if(amodel.length==2)
{
System.out.println("2");
Statement st1=con.createStatement();
st1.executeUpdate("update owner set maker='"+amodel[0]+"',model1='"+amodel[1]+"' where model_desc='"+model+"'");
kk++;
System.out.println("records updated"+" "+kk);
}
if(amodel.length==3)
{
System.out.println("3");
Statement st1=con.createStatement();
st1.executeUpdate("update owner set maker='"+amodel[0]+"',model1='"+amodel[1]+"',model2='"+amodel[2]+"' where model_desc='"+model+"'");
kk++;
System.out.println("records updated"+" "+kk);
}
if(amodel.length>=4)
{
System.out.println("4");
Statement st1=con.createStatement();
st1.executeUpdate("update owner set maker='"+amodel[0]+"',model1='"+amodel[1]+"',model2='"+amodel[2]+"',model3='"+amodel[3]+"' where model_desc='"+model+"'");
kk++;
System.out.println("records updated"+" "+kk);
}
m++;
//con=getConnection();
}
if(m==50)
{
ArrayList al=new ArrayList();
al.add(rs);
//con.close();
con=getConnection();
rs=(ResultSet)al.get(0);
m=0;
}
}
//System.out.println("COLUMN ADDED");
}
catch(Exception e)
{
System.out.println(e);
}
}
public static void main(String[] args) {
SpaceSpliting ss=new SpaceSpliting();
//ss.addingColumn();
ss.addingValues();
// TODO Auto-generated method stub
}
}
答案 0 :(得分:5)
我认为直接的问题是你在代码的这一部分中像疯了一样泄漏连接:
...
m++;
//con=getConnection();
}
if(m==50)
{
ArrayList al=new ArrayList();
al.add(rs);
//con.close();
con=getConnection();
rs=(ResultSet)al.get(0);
m=0;
}
对于您从主ResultSet
读取的每50个结果,您似乎创建了一个新的数据库连接。我无法看到你在哪里关闭它们。不久之后,Oracle DB服务器就会拒绝为您提供更多连接。
但是,检索2500万个结果并执行2500万个人更新中的一些重要部分将花费很长时间。我认为你应该尝试使用更聪明的SQL ...或PLSQL。 (问一个数据库专家。我只是一个Java人:-))
答案 1 :(得分:2)
我认为超时存在问题,所以增加时间就像这样
con.setNetworkTimeout(null, 100000);
答案 2 :(得分:2)
问题可能是你发布了用于读取所有者表的变量con
:
public void addingValues()
{
try
{
Connection con=getConnection();
Statement st=con.createStatement();
ResultSet rs=st.executeQuery("select * from owner");
while(rs.next())
{
[...]
if(m==50)
{
ArrayList al=new ArrayList();
al.add(rs);
//con.close();
con=getConnection();
rs=(ResultSet)al.get(0);
m=0;
}
通过为con
分配新值,原始Connection对象将成为孤立对象。如果没有任何内容引用原始的Connection对象,垃圾收集器很可能会丢弃它,结果就会关闭运行请求。
答案 3 :(得分:1)
我遇到了类似的问题,并将autocommit标志设置为false,并且手动提交事务就行了。由于记录数量为2500万,您还应该采用一批较大的记录。
如果您尝试了其他答案中提供的解决方案但仍然无法解决错误,那么您可能想尝试一下: