以编程方式启动Derby

请查看以下代码

DataBaseConnector.java

import java.sql.*; import javax.swing.*; public class DataBaseConnector { private Connection con; public DataBaseConnector() { } private boolean createConnection() { try { Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); con = DriverManager.getConnection("jdbc:derby://localhost:1527/contact;create=true","yohanrw","knight"); } catch(Exception e) { System.out.println("Error getConnection"); e.printStackTrace(); JOptionPane.showMessageDialog(null,e.getLocalizedMessage()); return false; } return true; } private void closeConnection() { try { con.close(); } catch(Exception e) { JOptionPane.showMessageDialog(null,e.getLocalizedMessage()); } } public void insertData(int id, String firstName, String lastName) { createConnection(); try { PreparedStatement ps = con.prepareStatement("insert into APP.FRIENDS values(?,?,?)"); ps.setInt(1, id); ps.setString(2, firstName); ps.setString(3, lastName); int result = ps.executeUpdate(); if(result>0) { JOptionPane.showMessageDialog(null,"Data Inserted"); } else { JOptionPane.showMessageDialog(null,"Something Happened"); } } catch(Exception e) { e.printStackTrace(); JOptionPane.showMessageDialog(null,e.getLocalizedMessage()); } finally { closeConnection(); } } public void viewData() { createConnection(); try { Statement st = con.createStatement(); ResultSet rs = st.executeQuery("select * from APP.FRIENDS"); StringBuffer sb = new StringBuffer(""); while(rs.next()) { sb.append(rs.getInt(1)+"\n"); sb.append(rs.getString(2)+"\n"); sb.append(rs.getString(3)+"\n"); } JOptionPane.showMessageDialog(null,sb); } catch(Exception e) { } } } 

DatabaseUI

 import java.awt.event.*; import javax.swing.*; import java.awt.*; public class DatabaseUI extends JFrame { private JLabel firstName, id, lastName; private JTextField idTxt, firstNameTxt, lastNameTxt; private JButton ok, view; public DatabaseUI() { firstName = new JLabel("First Name: "); lastName = new JLabel("Last Name: "); id = new JLabel("ID: "); firstNameTxt = new JTextField(10); lastNameTxt = new JTextField(10); idTxt = new JTextField(10); ok = new JButton("ADD"); ok.addActionListener(new OKAction()); view = new JButton("View"); view.addActionListener(new ViewAction()); JPanel centerPanel = new JPanel(); centerPanel.setLayout(new GridLayout(4,2)); centerPanel.add(id); centerPanel.add(idTxt); centerPanel.add(firstName); centerPanel.add(firstNameTxt); centerPanel.add(lastName); centerPanel.add(lastNameTxt); centerPanel.add(view); centerPanel.add(ok); getContentPane().add(centerPanel,"Center"); this.pack(); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private class OKAction implements ActionListener { public void actionPerformed(ActionEvent ae) { DataBaseConnector db = new DataBaseConnector(); int id = Integer.parseInt(idTxt.getText()); db.insertData(id, firstNameTxt.getText().trim(), lastNameTxt.getText().trim()); } } private class ViewAction implements ActionListener { public void actionPerformed(ActionEvent ae) { DataBaseConnector db = new DataBaseConnector(); db.viewData(); } } public static void main(String[]args) { new DatabaseUI(); } } 

在这种情况下,我需要通过右键单击数据库节点>启动服务器来手动启动derby(我正在使用NetBeans)。 这是一个嵌入式数据库,这意味着我将这个从一台机器转移到另一台机器,并且愿意只需双击jar文件就可以启动,而不是在每台机器上配置数据库并手动启动它们。 但是,如果我没有手动启动数据库,我会收到错误

java.sql.SQLNonTransientConnectionException:java.net.ConnectException:在端口1527上连接到服务器localhost时出错,并显示消息Connection refused:connect。

即使在NetBeans中,如果我没有手动启动它,也会出现错误。 如何在我的程序中启动Derby,而无需手动启动它? 我尝试了一些像“ create=true ”参数,NetworkServer.start()的方法,但没有好处。 但是我不确定我是否正确地做到了。

这是一个嵌入式数据库,这意味着我将这个从一台机器转移到另一台机器,并且愿意只需双击jar文件即可启动,

对于derby,嵌入式数据库意味着数据库在JVM中运行并写入文件系统。 这意味着您可以按需要移动jar文件,但是如果您使用嵌入式数据库,则运行该程序的每台计算机都将拥有自己独立的数据库,并且只有一个JVM可以使用该数据库。时间。 那是你要的吗?

如果是这样,问题是程序使用的URL。 "jdbc:derby://localhost:1527/contact;create=true"是一个告诉DriverManager连接到远程数据库的URL。 程序首先加载嵌入式驱动程序并不重要。

Derby中的嵌入式URL看起来像这样。 jdbc:derby:bar;create=true ,它将使用Derby系统主目录或当前工作目录之外的bar目录中的嵌入式数据库。 有关嵌入式URL的更多信息,请参阅此处连接到基于文件的derby数据库 。