javafx连接到mysql

时间:2012-11-17 19:08:20

标签: mysql connection javafx

我们正在构建javafx应用程序,它将展示有关股票的信息。 这是网站: http://analiza.host-ed.me/

但是我们遇到了一个很大的问题。每个免费托管都不允许远程mysql连接。还有我的问题。当我们的站点在服务器上(我链接)是这个远程连接还是本地连接? 当我们将这个javafx应用程序作为一个站点时,它无法像在本地计算机上那样连接... 有什么解决方案吗?感谢帮助。 (我们需要使用免费托管,因为它只是一个学校项目..)

1 个答案:

答案 0 :(得分:2)

您可以从JavaFX访问MySQL。但是JavaFX在客户端上运行,像php这样的东西通常在服务器上运行。您需要从Java应用程序到MySQL的连接。由于您的托管服务提供商不允许您从Java客户端应用程序直接连接到数据库端口,因此您还需要一些其他方式进行连接。

您可以通过端口80进行隧道传输,您可以运行servlet(或php服务器代码等)以通过基于HTTP的REST接口拦截传入流量和代理数据库调用,或者您可以在客户端本地安装数据库。

我将假设,对于一个学校项目,每台客户机都可以拥有自己的数据库。在这种情况下,不使用MySQL,而是使用像H2这样的轻量级Java数据库,通过将其作为依赖库包含在应用程序中,将其与应用程序捆绑在一起,将package应用程序加上DB jar作为签名的WebStart应用程序使用JavaFX打包工具并托管托管服务提供商处的打包工具生成的文件。

<强>更新

以下是在客户端计算机上使用本地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中,该目录是操作系统和用户特定的。对于我来说,它的最终版本为C:\Users\john_smith\test.h2.db。使用诸如jdbc:h2:~/test之类的jdbc连接字符串比jdbc:h2:C:\\Baza之类的字符串更可取,因为其中包含C:\\的字符串是特定于平台的,并且在非Windows系统上无法正常工作。有关h2 jdbc连接字符串的更多信息,请参阅connections settings in the h2 manual

h2系统的工作原理是,如果数据库文件已经存在,则会重复使用,否则会创建新的数据库文件。如果您修改数据库,关闭应用程序,然后在一周后再次加载应用程序,它就能够读取前一周创建的数据。