2012-11-17 5 views
1

우리는 주식에 대한 정보를 제공 할 javafx 응용 프로그램을 빌드 중입니다. 여기에 웹 사이트가 있습니다 : http://analiza.host-ed.me/javafx mysql에 연결

하지만 큰 문제가 있습니다. 모든 무료 호스팅은 원격 mysql 연결을 허용하지 않습니다. 그리고 내 질문이있다. 우리 사이트가 서버에 있다면 (내가 링크 된)이 원격 연결 또는 로컬 연결입니까? 우리는이 javafx 응용 프로그램을 사이트로 연결하면 로컬 컴퓨터에있는 것처럼 연결할 수 없습니다 ... 해결책이 있습니까? 도와 주셔서 감사합니다. (단지 학교 프로젝트이기 때문에 무료 호스팅을 사용해야합니다.)

+0

이것은 프로그래밍 문제가 아닙니다. 그러나 건설적인 것으로 결론을 내리기 위해 투표를 끝내십시오 ... 저는 프로젝트의 범위가 방금 확장되었다고 생각합니다. 이제 개인 서버를 설정하거나 로컬 시스템에서 데모를 실행하는 방법에 대해 알아야합니다. – Quaternion

+0

그래서 ...PHP 코드에서 mysql에 접근 할 수 있다면 왜 javafx에서 그것을 할 수 없습니까? 아니면 내가 할 수 있을까 ..? – damian

+0

그들은 서버 외부에서 mysql에 연결할 수 없습니다. 난 그냥 당신이 그런 연결이 필요하다고 생각하고 그것은 구현/구성/서비스 공급자 선택 문제였다. jewelsea가 대답 한 후에는 원격 요청을 받아들이도록 mysql을 구성 할 수 있다는 것을 깨달았지만 클라이언트에게 많은 권한을 부여하고 보안은 까다 롭습니다. 당신이 일반적으로 원하는 것은 웹 서비스 (json, xml, 아마도 웹 소켓)입니다. Java를 프런트 엔드 개발에 사용하고 있기 때문에 서버 측에서 Java를 사용하는 것이 합리적 일 수 있습니다. Struts2/Spring-MVC를 고려해보십시오. – Quaternion

답변

2

JavaFX에서 MySQL에 액세스 할 수 있습니다. 하지만 JavaFX는 클라이언트에서 실행되며 PHP와 같은 것은 보통 서버에서 실행됩니다. java app에서 MySQL 로의 연결이 필요합니다. 호스팅 제공 업체가 자바 클라이언트 응용 프로그램에서 데이터베이스 포트에 직접 연결하는 것을 허용하지 않으므로 다른 방법으로 연결해야합니다.

포트 80을 터널링하여 HTTP 기반 REST 인터페이스를 통해 들어오는 트래픽 및 프록시 데이터베이스 호출을 가로 채기 위해 서블릿 (또는 PHP 서버 코드 등)을 실행하거나 클라이언트에 로컬로 DB를 설치할 수 있습니다.

학교 프로젝트의 경우 각 클라이언트 컴퓨터가 자신의 데이터베이스를 가지고 있어도 괜찮을 것이라고 가정합니다. 이 경우 MySQL을 사용하는 대신 H2과 같은 간단한 Java 데이터베이스를 사용하고 jar 파일을 종속 라이브러리로 포함하여 번들로 포함하고 package app 및 DB jar를 JavaFX 패키징 도구를 사용하여 서명 된 WebStart 응용 프로그램으로 추가하고 호스팅 제공 업체의 패키징 도구로 생성 된 파일

업데이트 여기

는 클라이언트 컴퓨터의 로컬 H2 데이터베이스를 사용하는 샘플 응용 프로그램입니다.

import java.sql.*; 
import java.util.logging.*; 
import javafx.application.Application; 
import javafx.collections.*; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.layout.*; 
import javafx.stage.Stage; 

public class H2app extends Application { 
    private static final Logger logger = Logger.getLogger(H2app.class.getName()); 
    private static final String[] SAMPLE_NAME_DATA = { "John", "Jill", "Jack", "Jerry" }; 

    public static void main(String[] args) { launch(args); } 

    @Override public void start(Stage stage) { 
    final ListView<String> nameView = new ListView(); 

    final Button fetchNames = new Button("Fetch names from the database"); 
    fetchNames.setOnAction(new EventHandler<ActionEvent>() { 
     @Override public void handle(ActionEvent event) { 
     fetchNamesFromDatabaseToListView(nameView); 
     } 
    }); 

    final Button clearNameList = new Button("Clear the name list"); 
    clearNameList.setOnAction(new EventHandler<ActionEvent>() { 
     @Override public void handle(ActionEvent event) { 
     nameView.getItems().clear(); 
     } 
    }); 

    VBox layout = new VBox(10); 
    layout.setStyle("-fx-background-color: cornsilk; -fx-padding: 15;"); 
    layout.getChildren().setAll(
     HBoxBuilder.create().spacing(10).children(
     fetchNames, 
     clearNameList  
    ).build(),  
     nameView 
    ); 
    layout.setPrefHeight(200); 

    stage.setScene(new Scene(layout)); 
    stage.show(); 
    } 

    private void fetchNamesFromDatabaseToListView(ListView listView) { 
    try (Connection con = getConnection()) { 
     if (!schemaExists(con)) { 
     createSchema(con); 
     populateDatabase(con); 
     } 
     listView.setItems(fetchNames(con)); 
    } catch (SQLException | ClassNotFoundException ex) { 
     logger.log(Level.SEVERE, null, ex); 
    } 
    } 

    private Connection getConnection() throws ClassNotFoundException, SQLException { 
    logger.info("Getting a database connection"); 
    Class.forName("org.h2.Driver"); 
    return DriverManager.getConnection("jdbc:h2:~/test", "sa", ""); 
    } 

    private void createSchema(Connection con) throws SQLException { 
    logger.info("Creating schema"); 
    Statement st = con.createStatement(); 
    String table = "create table employee(id integer, name varchar(64))"; 
    st.executeUpdate(table); 
    logger.info("Created schema"); 
    } 

    private void populateDatabase(Connection con) throws SQLException { 
    logger.info("Populating database");  
    Statement st = con.createStatement();  
    int i = 1; 
    for (String name: SAMPLE_NAME_DATA) { 
     st.executeUpdate("insert into employee values(i,'" + name + "')"); 
     i++; 
    } 
    logger.info("Populated database"); 
    } 

    private boolean schemaExists(Connection con) { 
    logger.info("Checking for Schema existence");  
    try { 
     Statement st = con.createStatement();  
     st.executeQuery("select count(*) from employee"); 
     logger.info("Schema exists");  
    } catch (SQLException ex) { 
     logger.info("Existing DB not found will create a new one"); 
     return false; 
    } 

    return true; 
    } 

    private ObservableList<String> fetchNames(Connection con) throws SQLException { 
    logger.info("Fetching names from database"); 
    ObservableList<String> names = FXCollections.observableArrayList(); 

    Statement st = con.createStatement();  
    ResultSet rs = st.executeQuery("select name from employee"); 
    while (rs.next()) { 
     names.add(rs.getString("name")); 
    } 

    logger.info("Found " + names.size() + " names"); 

    return names; 
    } 
} 

이 샘플에는 배포 가능한 응용 프로그램을 생성하는 corresponding NetBeans project이 있습니다. 프로젝트는 webstartapplet 모드에서 테스트 할 수 있습니다.

샘플의 경우 데이터베이스는 사용자 컴퓨터 (응용 프로그램을 다운로드 한 서버 아님)에 저장되고 응용 프로그램 실행 사이에 유지됩니다.

정확한 위치는 jdbc 연결 초기화 문자열에 따라 다릅니다. 필자의 샘플의 경우 데이터베이스는 사용자의 디렉토리 인 jdbc:h2:~/test에 있으며 OS와 사용자마다 다릅니다. Windows의 경우에는 C:\Users\john_smith\test.h2.db으로 끝납니다. jdbc:h2:~/test과 같은 jdbc 연결 문자열을 사용하는 것이 과 같은 문자열보다 바람직합니다. C:\\이 포함 된 문자열은 플랫폼마다 다르고 Windows가 아닌 시스템에서는 제대로 작동하지 않기 때문입니다. h2 jdbc 연결 문자열에 대한 자세한 내용은 connections settings in the h2 manual을 참조하십시오.

h2 시스템은 데이터베이스 파일이 이미 있으면 재사용되며, 그렇지 않으면 새 데이터베이스 파일이 만들어집니다. 데이터베이스를 수정하고 응용 프로그램을 종료 한 다음 1 주일 후에 다시 응용 프로그램을로드하면 1 주일 전에 작성된 데이터를 읽을 수 있습니다.

+0

대단히 감사합니다. 하지만 ... "항아리를 종속 라이브러리로 포함 시켜서 앱과 함께 묶어 라"무엇을 의미하는지 모르겠습니다. h2-1.3.169.jar 파일을 dowloading 한 다음 NetBeans의 빌드 경로에 추가했습니다. 하지만 내가 serwer에 내 애플 리케이션을 넣어 - 자바 런타임 오류가 항상 작동하지 않습니다. jar 파일을 로컬에서 실행할 때 제대로 작동합니다. 왜? – damian

+0

그것이 당신을 위해 작동하지 않는 이유를 모르겠습니다 - 그것은 나를 위해 작동합니다. [웹 시작 응용 프로그램] (https://s3.amazonaws.com/baanthaispa/h2app/webstart)을 만들 수있는 [샘플 프로젝트] (https://s3.amazonaws.com/baanthaispa/h2app.zip)를 만들었습니다. .html) 또는 [브라우저 내장 응용 프로그램] (https://s3.amazonaws.com/baanthaispa/h2app/applet.html)을 참조하십시오. (나는이 주석의 링크를 잠깐 동안 호스팅하고, 결국에는 주석을 삭제하고이 주석을 삭제할 것이다). – jewelsea

+0

그것은 이상합니다. 오늘도 서버에서 잘 작동합니다 ... (아무 것도 변경하지 않았습니다) 감사합니다. H2 데이터베이스를 사용할 때 데이터가 정확히 어디에 저장됩니까? 사용자 컴퓨터에서 로컬로? 사용자가 내 프로그램을 닫으면 하드 드라이브에 데이터가 저장됩니까? 예를 들면 다음과 같습니다. 연결 연결 = DriverManager.getConnection ( "jdbc : h2 : EMPLOYEEDB", "sa", ""); 그것은 내 프로젝트 폴더에 EMPLOYEEDB를 생성합니다. 그러나 jdbc : h2 : C : \\ Baza?는 무엇을 의미합니까 : jdbc : h2 : ~/test? – damian