Эффективная вставка в звездную схему с использованием JDBC

У меня есть модель звездообразной схемы, в которой Таблица серверов содержит информацию об имени сервера. Информационная таблица содержит информацию, которая мне нужна для конкретного сервера. А Таблица фактических данных содержит информацию о том, какой сервер и какую информацию содержит.

Server Table

введите описание изображения здесь

Information Table

введите описание изображения здесь

Actual Data Table

введите описание изображения здесь

Теперь проблема, с которой я столкнулся, - я пытаюсь вставить данные в таблицу данных с помощью JDBC. Но я не уверен, как мне добавлять данные в таблицу фактических данных в модели звездообразной схемы. Должен ли я подключаться к базе данных и вставлять ее каждый раз для каждой информации, или есть какой-либо прямой способ сделать это, связавшись с базой данных только один раз. Это мой код, в котором я получаю всю информацию для каждого сервера. А IndexData - это класс, в который я вставляю значения в Oracle Database.

    public void fetchlog() {
            InputStream is = null;
            InputStream isUrl = null;
            FileOutputStream fos = null;
            try {
                is = HttpUtil.getFile(monitorUrl);
                if(monitorUrl.contains("stats.jsp") || monitorUrl.contains("monitor.jsp")) {
                    trimUrl = monitorUrl.replaceAll("(?<=/)(stats|monitor).jsp$", "ping");
                }
                isUrl = HttpUtil.getFile(trimUrl);
                BufferedReader in   = new BufferedReader (new InputStreamReader (is));
            String line;
            int i=0,j=0,k=0;
            while ((line = in.readLine()) != null) {
                if(line.contains("numDocs")) {
                    docs = in.readLine().trim();
    //So should I keep on inserting into Database for each information, like this
     //IndexData id = new IndexData(timeStamp, ServerName, InformationName, docs);
                }  else if(line.contains("indexSize")) {
                    indexSize = in.readLine().trim();
    //For this information-- the same way?
    //IndexData id = new IndexData(timeStamp, ServerName, InformationName, indexSize);
                } else if(line.contains("cumulative_lookups")) {
                    cacheHits= in.readLine().trim();
    //For this information too-- the same way?
    //IndexData id = new IndexData(timeStamp, ServerName, InformationName, cacheHits);
                } else if(line.contains("lastCommitTime")) {
                    lastCommitTime = in.readLine().trim();     
    //For this information too-- the same way?
    //IndexData id = new IndexData(timeStamp, ServerName, InformationName, lastCommitTime );

            }

            BufferedReader inUrl   = new BufferedReader (new InputStreamReader (isUrl));
            String lineUrl;
            Pattern regex = Pattern.compile("<str name=\"status\">(.*?)</str>");

            while ((lineUrl = inUrl.readLine()) != null) {
                System.out.println(lineUrl);
                if(lineUrl.contains("str name=\"status\"")) {
                    Matcher regexMatcher = regex.matcher(lineUrl);
                    if (regexMatcher.find()) {
                        upDown= regexMatcher.group(1);
//For this information too-- the same way?
    //IndexData id = new IndexData(timeStamp, ServerName, InformationName, upDown);

                    }                   
                     System.out.println("Status:- " + status);                  
                }  
            }
    //Or is there some other way we can insert directly into database by communicating with database only one time not multiple times for each information.     
            //IndexData id = new IndexData(timeStamp, ServerName, InformationName, Value);
                fos = new FileOutputStream(buildTargetPath());
                IOUtils.copy(is, fos);
            } catch (FileNotFoundException e) {
                log.error("File Exception in fetching monitor logs :" + e);
            } catch (IOException e) {
                log.error("Exception in fetching monitor logs :" + e);
            }
        }

I hope question is clear to everyone. Any suggestions will be appreciated.

person arsenal    schedule 14.11.2011    source источник


Ответы (1)


Я бы посоветовал вам обратить внимание на две вещи. Во-первых, используйте пакетную вставку для выполнения всех связанных вставок в одной транзакции JDBC. Чтобы получить больше информации:

Пример пакетной вставки JDBC

Я также настоятельно рекомендую вам использовать библиотеку пула соединений JDBC. Мы используем c3p0 с нашей базой данных Postgres. Вы можете найти более подробную информацию здесь:

Страница проекта c3p0

Основная идея - создать пул соединений во время запуска, а затем создать пакеты JDBC для каждого набора связанных вставок.

person Jason Buberel    schedule 14.11.2011
comment
Я использую пул соединений jdbc во время запуска. Но я не понимаю, как мне вставлять в базу данных. Если схема не была звездообразной, то я сделал это одним способом, например, IndexData id = new IndexData(timeStamp, ServerName, updown, indexSize, cacheHits,lastCommit,docs); - person arsenal; 15.11.2011
comment
Вот лучший URL-адрес для примера пакетной операции на Java с JDBC. Предполагая, что вы уже знаете, как получить соединение из пула соединений: jguru.com/ faq / view.jsp? EID = 5079 - person Jason Buberel; 16.11.2011