2010-12-10 91 views
1

我使用struts創建了一個頁面。當在localhost(glassfish)上運行時,它工作正常。 但是,當我將WAR文件複製到遠程服務器並從那裏運行應用程序登錄表單不起作用。這意味着在連接mysql數據庫時出現問題。MySql無法從部署的Java Web應用程序工作

我該如何解決這個問題?

代碼片段:

Connection conn = null; 
    Statement stmt = null; 
    try{ 
     InitialContext ctx = new InitialContext(); 
     DataSource ds = (DataSource)ctx.lookup("jdbc/SB"); 


     conn = ds.getConnection(); 
     stmt = conn.createStatement(); 
     ResultSet rs = null; 
     if(stmt.execute("SELECT * FROM users WHERE username='"+loginform.getUsername()+"' AND geslo=MD5('"+loginform.getPassword()+"') LIMIT 1;")) 
     { 
    rs = stmt.getResultSet(); 
     } 

     rs.next(); 

可惜我不能從服務器控制檯讀取。我還應該做些什麼才能看到異常(遠程日誌?)?

感謝回覆。

更新: - 本地和遠程GlassFish 3.0.1都在運行。 - 我的工作環境是NetBeans 6.9.1。 - 本地部署僅在NetBeans中完成。我只需點擊項目名稱並點擊發布。對於遠程部署,管理員可以訪問我剛剛複製WAR文件的FTP服務器。 - MySQL服務器位於其他地方。重點是,它可以從本地主機Web應用程序訪問,但不能從同一個遠程Web應用程序訪問。

+0

用一堆廉價的調試器在程序中的每個點。看看屏幕上沒有寫什麼......舊學校,但工作。 – johnny 2010-12-10 21:43:26

+0

@johnny - *「不幸的是,我無法從服務器控制檯讀取。」*。 – 2010-12-10 23:47:51

+0

您可以通過在您的問題中添加更多詳細信息來獲得更好的答案。您在本地運行哪個版本的GlassFish?哪個版本是遠程版本或GlassFish?你如何在本地機器上部署應用程序?你如何將應用程序部署到遠程機器?你的管理員告訴你做什麼來部署你的應用程序?通過包含更多細節,人們將能夠理解您的特定環境併爲您量身定製一個答案,以防止您必須跟進大量虛假的線索。 – vkraemer 2010-12-11 16:29:38

回答

1

假設您在遠程服務器上的管理權限,您需要

  1. 驗證數據源「jdbc/SB」是否存在。(資源/ JDBC/JDBC資源)
  2. 驗證datasoucre中的「poolname」是否存在(Resources/JDBC/Connection Pools)
  3. 打開適當的連接池並單擊「ping」按鈕。
  4. 如果ping無法驗證其他屬性選項卡下的連接參數。

有可能是其他的十幾個問題以及。您確實需要訪問服務器日誌,以便查看具體的異常情況。這是不太可能是你的代碼,並更有可能是遠程服務器缺少驅動程序相關或沒有正確配置(連接池的數據源)

+0

這是我的異常(只是從日誌中獲取):[javax.naming.NamingException] SerialContext中'jdbc/SB'的查找失敗javax.naming.NamingException:SerialContext中的'jdbc/SB'查找失敗[Root exception是javax.naming.NameNotFoundException:未找到SB]。我想我必須告訴管理員爲我創建一個數據源和池。或者我可以做任何事情而不要求管理員這樣做? – Aliens 2010-12-12 11:54:37

+0

@Aliens - 你必須要求管理員爲你設置。由於您使用的是NB,所以很可能您的項目$ PROJECT_ROOT/setup/sun-resources.xml中有一個文件。您可以將該文件提供給管理員,並要求他們使用asadmin add-resources http://docs.sun.com/app/docs/doc/821-1758/add-resources-1?l=en&a=view註冊你的資源。 – vkraemer 2010-12-12 16:36:59

+0

我發送了你建議的admin xml文件,他遵循了你的建議。連接數據庫終於有效。謝謝。 – Aliens 2010-12-12 20:00:29

0

一些想法
- 記錄到文件,而不是控制檯
- 打印記錄您的支柱
頁 上 - 也許你沒有授權或防火牆的問題訪問DB

+0

我不確定我是否可以訪問遠程Glassfish服務器上的日誌文件。管理員只給了我上傳我的項目到服務器的可能性。 – Aliens 2010-12-11 00:39:45

0

我敢打賭你沒有權限訪問數據庫...

試試這個作爲測試...在另一臺機器上安裝MySQL客戶端,然後從那裏連接到MySQL服務器。

如果失敗,則:

說你登錄: 用戶:測試 密碼:password

然後打開MySQL客戶端,輸入:

use nameOfDatabase; 
GRANT ALL ON nameofDatabase.* TO 'userName'@'ipaddressOfServerOrDNSName'; 

應該這樣做。

還有其他的方法來提供訪問看到http://dev.mysql.com/doc/refman/5.1/en/grant.html

+0

我的機器上的MySql客戶端成功連接到數據庫並執行選擇,更新和插入操作。只有當MySql客戶端在遠程服務器上運行時,問題纔會發生。我試圖寫GRANT ALL語句,但我得到錯誤代碼1044,這意味着我無權訪問權限。我應該聯繫管理員。 – Aliens 2010-12-11 00:21:49

+0

注意GRANT的第二部分:一個IP地址。您所有的成功建議是,您的機器可能已被授予訪問權限,但遠程服務器沒有。 – duffymo 2010-12-11 04:29:25

0

你確定你的數據庫是正確設置你的遠程服務器上?這聽起來像是一個防火牆問題。

+0

我可以從我的本地主機應用程序訪問數據庫,沒有問題。所以它不應該是數據庫。 – Aliens 2010-12-11 00:26:26

0

不幸的是,我無法從服務器控制檯讀取。

如果你有到遠程服務器shell訪問,解決方法很簡單:

  • 更改日誌CONFIGS讓你的web應用日誌文件而不是/以及控制檯。
  • 登錄並閱讀文件。

(事實上,如果你使用的是Tomcat,寫東西到System.out/System.err的寫入文件反正。也許這是真的了GlassFish還。)

如果你不這樣做有外殼訪問權限,您可能需要修改您的Web應用程序以提供一個額外的頁面,可用於從您的Web瀏覽器下載或查看日誌文件。如果你不得不求助於此,請注意明顯的安全問題。

0

這是我的WEG(野生眼猜)....

你的本地應用程序服務器已安裝了MySQL驅動程序。 JDBC資源也被正確定義。 MySql服務器可能正在本地主機上運行。您在NetBeans中本地開發了您的應用程序。

當您將應用程序從NetBeans部署到本地服務器時,IDE會確保服務器安裝了數據庫驅動程序。當您部署到遠程主機時,NetBeans無法做到這一點。如果您使用其他部署方法,則驅動程序安裝不是自動的。這是一個容易忘記的步驟。

您可以通過編寫一個Web應用程序來嘗試加載或使用驅動程序jar文件中的某個類,以瞭解MySql驅動器是否安裝在您的服務器上。如果訪問產生一個異常,你可以通過在Web應用程序的WEB-INF/lib中包含MySql驅動器來獲得一些有用的東西。

NetBeans還幫助人們創建和管理其JDBC資源定義。如果您創建了一個針對本地主機上的數據庫的應用程序,則JDBC資源將具有localhost作爲URL的一部分。當應用程序部署到與數據庫服務器相同的服務器上時,這將非常有效。如果應用程序移動到另一臺服務器,則需要更改JDBC資源以說明數據庫服務器不在本地主機上的可能性。

如果您沒有管理員訪問遠程服務器的權限,那麼您將無法獲取定義的資源。如果您的遠程服務器是GlassFish 3.1域/實例,則可以利用application scoped resources獲取爲您的應用定義的資源。

關於對日誌文件的訪問。

如果您使用asadmin將其部署到遠程服務器上,則使用此命令將幫助您訪問服務器日誌(如果使用GlassFish v2.x:http://docs.sun.com/app/docs/doc/821-0179/display-log-records-1?l=en&a=view)。您也可以通過管理控制檯訪問日誌。

如果使用rcp將應用程序部署到遠程服務器的autodeploy目錄中,則可能需要查看是否可以將日誌複製到本地計算機上。

例如...如果你的管理員告訴您使用ftp命令這樣的部署:

ftp> cd /a/b/glassfish/domains/domain1/autodeploy 
ftp> put MyGreatWebapp.war 

你可以通過做這樣的事情來獲取日誌:

ftp> cd /a/b/glassfish/domains/domain1/logs 
ftp> get server.log 

實驗....

+0

感謝您的建議。 – Aliens 2010-12-12 20:01:13