【问题标题】:Want to run thread in java database connectivity every 24 hours time interval想要每隔 24 小时时间间隔在 java 数据库连接中运行线程
【发布时间】:2018-02-10 03:45:41
【问题描述】:

这是我用来将取自本地数据库的值插入在线数据库的代码。我从一个本地数据库中获取数据,并将其中的每条记录上传到在线的 17 个不同的表中。代码运行成功,但在 24 小时结束时,代码自动终止,在线程休眠时间后第二次运行。我不知道为什么会这样。请给我一个解决方案,让我每 24 小时运行一次代码。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;

class online_data
{
    public static void main(String args[])
    {
        MyThread1 thread1 = new MyThread1();
        thread1.start();
    }
}
class MyThread1 extends Thread
{

    public void run()
    {
        try{  
          Class.forName("com.mysql.jdbc.Driver"); 

          //Connection1
          Connection con=DriverManager.getConnection("jdbc:mysql://sql124.main-hosting.eu/u678426119_kcg","u678426119_kcg","deepak"); 
          Statement stmt=con.createStatement();

          //Connection2
          Connection conn=DriverManager.getConnection("jdbc:mysql://localhost/kcg","root","icdipl"); 
          Statement stmt2=conn.createStatement();
          int i = 1;
          String s = "online_data";

          while(true)
          {
            String s1 = s+i;
            //Date & Time
            Date dNow = new Date( );
            SimpleDateFormat ft = new SimpleDateFormat ("yyyy.MM.dd");
            SimpleDateFormat ft1 = new SimpleDateFormat ("hh:mm:ss");
            ResultSet rs=stmt2.executeQuery("select * from online_data");  
            while(rs.next())
            {
                String q="INSERT INTO "+s1+" VALUES ("+rs.getInt(1)+","+rs.getInt(2)+",'"+rs.getString(3)+"',"+rs.getFloat(4)+","+rs.getFloat(5)+","+rs.getFloat(6)+","+rs.getFloat(7)+","+rs.getFloat(8)+","+rs.getFloat(9)+","+rs.getFloat(10)+","+rs.getFloat(11)+","+rs.getFloat(12)+","+rs.getFloat(13)+","+rs.getFloat(14)+","+rs.getFloat(15)+","+rs.getFloat(16)+","+rs.getFloat(17)+","+rs.getFloat(18)+","+rs.getFloat(19)+","+rs.getFloat(20)+","+rs.getFloat(21)+","+rs.getFloat(22)+","+rs.getFloat(23)+",'"+rs.getString(24)+"',"+rs.getFloat(25)+",'"+rs.getString(26)+"',"+rs.getFloat(27)+",'"+rs.getString(28)+"',"+rs.getFloat(29)+","+rs.getFloat(30)+","+rs.getFloat(31)+","+rs.getFloat(32)+","+rs.getFloat(33)+","+rs.getFloat(34)+","+rs.getFloat(35)+",'"+rs.getString(36)+"',"+rs.getFloat(37)+",'"+rs.getString(38)+"','"+rs.getString(39)+"',"+rs.getFloat(40)+","+rs.getFloat(41)+","+rs.getFloat(42)+","+rs.getFloat(43)+","+rs.getFloat(44)+","+rs.getFloat(45)+","+rs.getFloat(46)+","+rs.getFloat(47)+","+rs.getFloat(48)+",'"+rs.getString(49)+"','"+rs.getString(50)+"',"+rs.getFloat(51)+","+rs.getFloat(52)+",'"+rs.getString(53)+"',"+rs.getFloat(54)+","+rs.getFloat(55)+","+rs.getFloat(56)+","+rs.getFloat(57)+","+rs.getFloat(58)+","+rs.getFloat(59)+","+rs.getFloat(60)+","+rs.getFloat(61)+","+rs.getFloat(62)+","+rs.getFloat(63)+","+rs.getFloat(64)+","+rs.getFloat(65)+","+rs.getFloat(66)+","+rs.getFloat(67)+","+rs.getFloat(68)+","+rs.getFloat(69)+","+rs.getFloat(70)+","+rs.getFloat(71)+","+rs.getFloat(72)+","+rs.getFloat(73)+","+rs.getFloat(74)+","+rs.getFloat(75)+","+rs.getFloat(76)+","+rs.getFloat(77)+","+rs.getFloat(78)+","+rs.getFloat(79)+","+rs.getFloat(80)+","+rs.getFloat(81)+","+rs.getFloat(82)+","+rs.getFloat(83)+","+rs.getFloat(84)+","+rs.getFloat(85)+","+rs.getFloat(86)+",'"+rs.getString(87)+"',"+rs.getFloat(88)+",'"+rs.getString(89)+"',"+rs.getFloat(90)+",'"+rs.getString(91)+"',"+rs.getFloat(92)+",'"+rs.getString(93)+"',"+rs.getFloat(94)+",'"+rs.getString(95)+"',"+rs.getFloat(96)+",'"+rs.getString(97)+"',"+rs.getFloat(98)+",'"+rs.getString(99)+"',"+rs.getFloat(100)+",'"+rs.getString(101)+"','"+ft.format(dNow)+"','"+ft1.format(dNow)+"')";
                stmt.executeUpdate(q);
                i+=1;
            }

            randomWait();
            i=1;
          }
          }catch(Exception e){ System.out.println(e);}  
    }


    void randomWait()
    {

        try {
           sleep((long)(1000*60*60*24));
        } catch (InterruptedException x) {
            System.out.println("Interrupted!");
         }
     }
 }

【问题讨论】:

  • 您真的只是在两个 打开 数据库连接的情况下睡了 24 HOURS 吗?!?在那张纸条上,您可能会收到一个打印的异常,告诉您确切地为什么您的无限循环终止了,并且它可能涉及无效连接...

标签: java mysql database jdbc thread-sleep


【解决方案1】:

对于初学者,请尝试将您的数据库连接移动到 while 循环中,并在完成它们时关闭它们(即在线程进入睡眠状态之前)。

然后,不要在一个休眠 24 小时的线程中执行所有这些操作,而是考虑在单个静态方法中执行此操作,将对该方法的调用封装在 TimerTask 或类似的东西中,并使用 Timer或相当于安排事情。

【讨论】:

  • 或安排一个每 24 小时运行一次的 cron 作业
  • 我的意思是我只是试图回答这个问题。但是,是的,我觉得这真的是 The Wrong Way™
【解决方案2】:

尝试在“while (true)”中打开连接,并在此 while 循环结束时关闭连接。这样,您的连接将每 24 小时打开一次,然后执行选择/插入,然后在完成所有数据库操作后连接将立即关闭。

如果您希望程序在数据库操作失败(引发异常时)期间不终止,并在失败 24 小时后再次尝试 select/insert - 您需要一个内部 try/catch/finally 块来捕获并记录/忽略异常。理想情况下,关闭连接应该在 finally 块中完成(在 try/catch/finally 块中)——在任何一种情况下都关闭连接——无论数据库操作是否成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-14
    • 2021-02-16
    • 2017-11-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 2016-01-27
    • 2017-04-20
    相关资源
    最近更新 更多