流数据的最佳和唯一主键

时间:2018-01-05 03:51:43

标签: java sql sql-server jdbc

新手问题....在一个项目中,使用JDBC将流媒体市场数据捕获到SQL服务器上,我正在使用来自代理系统的Java检索数据,...什么是最好和唯一的主键可用于SQL数据库..以及它的java等价物。该项目旨在连续6个交易日(144小时)连续捕获外汇市场数据。 - 谢谢。

这是我的代码。有用。毫无疑问,专业人士可以提高效率,但这里是相关课程。我将UniqueIdentifier作为varchar(MAX)插入到sql数据库中。感谢。

package packagename;

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


public class QuoteInserter extends DownloaderMarketData {
    private static final String jdbcDriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    private static final String jdbcURL = "jdbc:sqlserver://localhost:1433;databaseName=test;user=sa;password=974974;";


    static void quoteInsert(double bid0, double ask0, String time1) {



                System.out.println("Program started");
                try
                {  Class.forName(jdbcDriver).newInstance();
                    System.out.println("JDBC driver loaded");  }
                catch (Exception err)
                {  System.err.println("Error loading JDBC driver");
                    err.printStackTrace(System.err);
                    System.exit(0);    }

                Connection databaseConnection= null;

                try
                {
                    //Connect to the database
                    databaseConnection = DriverManager.getConnection(jdbcURL);
                    System.out.println("Connected to the database");
                }
                catch (SQLException err)
                {
                    System.err.println("Error connecting to the database");
                    err.printStackTrace(System.err);
                    System.exit(0);
                }


        Date date = new Date();

        SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyy");
        SimpleDateFormat dateFormat2 = new SimpleDateFormat("MM");
        SimpleDateFormat dateFormat3 = new SimpleDateFormat("dd");
        SimpleDateFormat dateFormat4 = new SimpleDateFormat("hh");
        SimpleDateFormat dateFormat5 = new SimpleDateFormat("mm");
        SimpleDateFormat dateFormat6 = new SimpleDateFormat("ss");
        SimpleDateFormat dateFormat7 = new SimpleDateFormat("SSSSSSSSS");
        SimpleDateFormat dateFormat8 = new SimpleDateFormat("a");


        String year     =dateFormat1.format(date);
        String month    =dateFormat2.format(date);     
        String day      =dateFormat3.format(date);
        String hour     =dateFormat4.format(date);
        String minute   =dateFormat5.format(date);
        String second   =dateFormat6.format(date);
        String microsec =dateFormat7.format(date);
        String ampm     =dateFormat8.format(date);
        String bidFromDouble = Double.toString(bid0);
        String askFromDouble = Double.toString(ask0);

        Random rand = new Random();
        int  n = rand.nextInt(500000000);
        String randomNumber = Integer.toString(n) ;        

        StringBuilder sb = new StringBuilder(year);
        sb.append("-");
        sb.append(month);
        sb.append("-");
        sb.append(day);
        sb.append("-");
        sb.append(hour);
        sb.append("-");
        sb.append(minute);
        sb.append("-");
        sb.append(second);
        sb.append("-");
        sb.append(microsec);
        sb.append("-");
        sb.append(ampm);
        sb.append("-");
        sb.append(bidFromDouble);
        sb.append("-");
        sb.append(askFromDouble);
        sb.append("-");
        sb.append(randomNumber);



                try
                { Statement sqlStatement = databaseConnection.createStatement();
                    String commandString="INSERT INTO [dbo].[BidAsk02] (UniqueIdentifier,Hour,Bid1,Ask1) VALUES ('"+sb+"','"+hour+"','"+bid0+"','"+ask0+"')";  

                    //print the command string to the screen
                    System.out.println("\nCommand string:");
                    System.out.println(commandString);

                    //execute the command using the execute method
                    sqlStatement.execute(commandString);
                    System.out.println("Closing database connection");
                    //close the database connection


                    databaseConnection.close();     }

                catch (SQLException err)
                {  System.err.println("SQL Error");
                    err.printStackTrace(System.err);
                    System.exit(0);   }

                System.out.println("Program finished");


}
}

1 个答案:

答案 0 :(得分:1)

在高吞吐量(银行)系统和SCADA实现中,我已经看到T-SQL的UniqueIdentifier数据类型被堆叠。基本上你会有两个或更多列这个数据类型,基本上是一个GUID。

缺点在于应用程序端,您可能将这些基本上视为一个字符串,然后利用grep来获得更好的性能,如果您必须对它们的集合执行“进行中”操作。

注意:堆叠物是一种非常偏执的方法。连接两个GUID将大大降低重复标识符的可能性。由于用于生成GUID的算法通常基于多种技术,包括当前时间,RNG,硬件标识符和其他因素,因此使用甚至单个GUID字段为高吞吐量系统运行复制已经极不可能。模仿独特性。