2011-11-22 33 views
0

我有一個非常短的Java應用程序,它只是打開與遠程MySQL數據庫的連接,讀取一些數據,打印它並退出。數據庫連接是應用程序中最耗時的部分。如何在打開JDBC MYSQL連接時節省時間

目前我只有一個線程,我唯一的擔心是保存打開連接的時間。

我想到的幾種方法,使其更快,但事實證明他們不幫助:

  • 連接池 - 沒有幫助,因爲池中的應用程序的一個運行期間只生活而已。當應用程序終止時,池已經消失,當我重新運行應用程序時,我必須重新打開池中的所有連接。
  • MySQL的代理 - 只連接到本地服務器:mysql-proxy for a remote MySQL server
  • TCP/IP服務器 - 我以爲持有,將保持一個持續開放的連接,並將其發送到TCP/IP客戶端上的本地TCP/IP服務器請求。但是,Connection對象不能被序列化,所以我無法將Connection對象從客戶端傳遞到服務器。

還有其他的選擇嗎?

+1

我們在這裏談論什麼?幾十毫秒?秒?是否有可能保持你的程序的「服務器」部分是活着的,它有一個持久連接,準備好你的「短」Java程序與之通信的語句等? –

+0

我們在談論多少時間?連接需要一段時間,但我們說幾秒或幾毫秒? –

+0

到遠程DB的連接大約需要10秒鐘。計算本身不到1秒。 –

回答

1

通常連接到數據庫是最耗時的操作。如果應用程序要啓動並停止,那麼您可以執行的操作很少。

在Web服務器中使用連接池並通過運行使用JSON與Web服務器通信的應用程序調用該服務可能是一個選項。

+0

我不明白第二個選項。你能否詳細說明一下? –

+0

有一個使用連接池的本地Web服務器。 Web服務器將始終在線等待查詢。當被問到時它會轉到數據庫。 Java應用程序爲數據調用Web服務器。這本身不是數據庫查詢。 Web服務器響應數據。Java應用程序使用這些數據。這應該有兩個最好的世界:連接池和更快的響應。但缺點是更基礎,即。一個Web服務器。 –

+0

這可能是一個不錯的選擇,但是我使用一些第三方代碼返回不可序列化的類,所以我無法從TCP/IP服務器發回它們。 –

1

你說你有一個非常短的應用程序,所以如果你把數據庫邏輯爲你「選項3 TCP/IP服務器」,只是前進的結果,您的客戶端連接你的第三個選項可能會奏效。這是典型的應用程序服務器模式。

+0

這可能是一個不錯的選擇,但是我使用一些第三方代碼返回不可序列化的類,所以我無法從TCP/IP服務器發回它們。 –

0

原來最好的解決方案是使用MySQL的代理與手柄連接池(我的前兩個選項的組合)的腳本。我在這裏找到一個這樣的腳本: http://forge.mysql.com/tools/tool.php?id=151

它可能是爲舊版本的mysql-proxy編寫的,所以我必須修復它(如果有人需要固定版本 - 寫信給我)。

它像一個魅力 - 我運行完全相同的應用程序像以前一樣,唯一的變化是在連接字符串:而不是連接到「qa-srv:3308」(遠程服務器)我連接到「127.0。 0.1:4040「(代理服務器)。