以编程方式启动 Derby
Posted
技术标签:
【中文标题】以编程方式启动 Derby【英文标题】:Starting Derby Programmatically 【发布时间】:2012-09-22 00:06:26 【问题描述】:请看下面的代码
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)
数据库用户界面
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 时出现错误消息 连接被拒绝:连接。
即使在NetBeans内部,如果我没有手动启动它,就会出现错误。如何在我的程序中启动 Derby,而无需手动启动它?我尝试了一些方法,例如“create=true
”参数、NetworkServer.start(),但都不好。但是我不确定我是否正确地做到了。
【问题讨论】:
【参考方案1】:这是一个嵌入式数据库,这意味着我要将它从一台机器转移到另一台机器上,只需双击 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 的更多信息,请参阅此处connecting to a file-based derby database。
【讨论】:
感谢您的回复,但它也无法正常工作。 “jdbc:derby:contact;create=true”给出“java.sql.SQLSyntaxErrorException: Table/View 'APP.FRIENDS' 不存在。”错误 @Sepala 那是因为新创建的数据库中不存在这些表。当您使用这样的嵌入式数据库时,您需要考虑它是新安装的情况,因此是一个没有表的空数据库。应用程序需要能够创建甚至可能演变数据库架构。 好的。但是怎么做呢?我的意思是,如果我要在每次应用程序启动时创建表,那么就不会有数据,不是吗? o.O @Sepala 这听起来像是一个全新的堆栈溢出问题。 :) 模式版本表很有用,如果不存在,那么您知道您在一个全新的数据库上。版本表还将帮助您为程序的新版本升级数据库。 但是,如果我使用您提供的那个 URL,我可以将我的数据库从一个地方移动到另一个地方,双击它并打开,而无需手动进行任何数据库配置,对吗?是的,正如你所问,这就是我想要的。我知道每台机器都会保留一份单独的副本,但这就是我所需要的。我不需要像 MS SQL Server 这样无法移动的服务器端。那么,这样对吗?以上是关于以编程方式启动 Derby的主要内容,如果未能解决你的问题,请参考以下文章