问题描述
我们正在构建 javafx 应用程序,它将显示有关股票的信息.这是网站:http://analiza.host-ed.me/
we are building javafx application which will be presenting information about stocks. Here is the website: http://analiza.host-ed.me/
但是我们遇到了一个大问题.每个免费主机都不允许远程 mysql 连接.还有我的问题.当我们的网站在服务器上(我链接的)是远程连接还是本地连接?当我们将此 javafx 应用程序作为站点时,它无法像在本地计算机上一样连接...有什么解决办法吗?感谢帮助.(我们需要使用免费托管,因为它只是一个学校项目..)
But we've got a huge problem. Every free hosting doesn't allow remote mysql connection. And there is my question. When our site is on the server (which i linked) is this remote connection or local connection? When we put this javafx app as a site it can't connect like it was on the local machine... Is there any solution? Thanks for help. (we need to use free hosting, because it's only a school project..)
推荐答案
您可以从 JavaFX 访问 MySQL.但是 JavaFX 在客户端上运行,而 php 之类的东西通常在服务器上运行.您将需要从您的 Java 应用程序连接到 MySQL.由于您的托管服务提供商不允许您从 Java 客户端应用程序直接连接到数据库端口,因此您将需要其他一些连接方式.
You can access MySQL from JavaFX. But JavaFX runs on a client and something like php usually runs on a server. You will need a connection from your java app to MySQL. As your hosting provider won't allow you to directly connect to the database port from your Java Client App, you will need some other way to connect.
您可以通过端口 80 进行隧道传输,可以运行 servlet(或 php 服务器代码等)以通过基于 HTTP 的 REST 接口拦截传入流量和代理数据库调用,或者您可以在客户端本地安装数据库.
You could tunnel through port 80, you could run a servlet (or php server code, etc) to intercept incoming traffic and proxy database calls through a HTTP based REST interface or you could install the DB locally on the client.
我将假设,对于学校项目,每台客户端计算机都可以拥有自己的数据库.在这种情况下,不要使用 MySQL,而是使用轻量级 Java 数据库,例如 H2,捆绑它通过将其 jar 作为依赖库包含在您的应用中,打包应用加上使用 JavaFX 打包工具将 DB jar 作为签名的 WebStart 应用程序,并将打包工具生成的文件托管在您的托管服务提供商处.
I'm going to assume, for a school project, it's ok for each client machine to have it's own database. In which case, instead of using MySQL, use a lightweight Java database like H2, bundle it with your app by including it's jar as a dependent library, package the app plus DB jar as a signed WebStart application using the JavaFX packaging tools and host the files generated by the packaging tools at your hosting provider.
更新
这是一个使用客户端计算机上的本地 H2 数据库的示例应用程序.
Here is a sample application which uses a local H2 database on the client computer.
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;
}
}
此示例有一个相应的 NetBeans 项目,它将生成一个可部署的应用程序.该项目可以在 webstart 和 小程序模式.
There is a corresponding NetBeans project for this sample which will generate a deployable application. The project can be tested in webstart and applet mode.
对于示例,数据库存储在用户的计算机上(而不是从其下载应用程序的服务器)并在应用程序运行之间保持不变.
For the sample, the database is stored on the user's computer (not the server from which the application was downloaded) and persists between application runs.
具体位置取决于 jdbc 连接初始化字符串.在我的示例中,数据库位于用户目录 jdbc:h2:~/test
中,该目录是操作系统和用户特定的.对于 Windows 的我来说,它最终位于 C:Usersjohn_smith est.h2.db
.使用诸如 jdbc:h2:~/test
之类的 jdbc 连接字符串优于使用诸如 jdbc:h2:C:\Baza
之类的字符串,因为带有 的字符串>C:\
是特定于平台的,在非 Windows 系统上无法正常工作.有关 h2 jdbc 连接字符串的更多信息,请参阅 h2 手册中的连接设置.
The exact location depends on the jdbc connection initialization string. In the case of my sample the database goes in the user's directory jdbc:h2:~/test
, which is OS and User specific. In the case of me for Windows it ends up at C:Usersjohn_smith est.h2.db
. Using a jdbc connection string such as jdbc:h2:~/test
is preferable to a string such as jdbc:h2:C:\Baza
because a string with C:\
in it is platform specific and won't work well on non-windows systems. For further information on h2 jdbc connection strings refer to the connections settings in the h2 manual.
h2 系统的工作原理是,如果数据库文件已经存在,则重新使用它,否则会创建一个新的数据库文件.如果您修改数据库,关闭应用程序,然后在一周后再次加载应用程序,它能够读取前一周创建的数据.
The h2 system works such that if the database file already exists, it is reused, otherwise a new database file is created. If you modify the database, shut the application down, then load the application again a week later, it is able to read the data created the week before.
这篇关于javafx连接到mysql的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!