5

Please have a look at the following code

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();
    }
}

In this case, I need to start the derby manually (I am using NetBeans) by right clicking clicking on database node > start server. This is an embedded database, which means I am taking this from one machine to another and willing to start just by double clicking on the jar file, and not configuring database in each and every machine and starting them manually. But, if I didn't start the database manually, I get an error

java.sql.SQLNonTransientConnectionException: java.net.ConnectException : Error connecting to server localhost on port 1527 with message Connection refused: connect.

No matter even inside NetBeans, if I didn't start it manually, the error comes. How I can start the Derby inside my program, without manually starting it? I have tried some ways like "create=true" parameter, NetworkServer.start(), but no good. However I am not sure whether I did it correctly.

user2428118
  • 7,935
  • 4
  • 45
  • 72
PeakGen
  • 21,894
  • 86
  • 261
  • 463

1 Answers1

9

This is a embedded database, which means I am taking this from one machine to another and willing to start just by double clicking on the jar file,

In the case of derby, an embedded database means that the database runs in the JVM and writes to the file system. Which implies that you can move the jar file around like you want, but if you use an embedded database, then each machine that you run the program on will have its own separate database, and one and only one JVM can use that database at a time. Is that what you want?

If so, the problem is the URL that the program uses. "jdbc:derby://localhost:1527/contact;create=true" is a URL that tells DriverManager to connect to a remote database. It doesn't matter that program loads the embedded driver first.

An embedded URL in Derby looks something like this. jdbc:derby:bar;create=true which will use an embedded database in the bar directory off of the Derby system home or current working directory. For more information on embedded urls, see here connecting to a file-based derby database.

Community
  • 1
  • 1
BillRobertson42
  • 12,602
  • 4
  • 40
  • 57
  • Thanks for the reply, but it is also not working. "jdbc:derby:contact;create=true" is giving "java.sql.SQLSyntaxErrorException: Table/View 'APP.FRIENDS' does not exist." error – PeakGen Oct 01 '12 at 15:13
  • @Sepala That's because the tables don't exist in the newly created database. When you're working with embedded databases like that, you'll need to account for situations where it's a new install, and therefore an empty database with no tables. The application will need to be able to create and possibly even evolve the database schema. – BillRobertson42 Oct 01 '12 at 16:09
  • OK. But how to do that? I mean, if I am gonna create tables each and every time the app is gonna start, then there will be no data, isn't it? o.O – PeakGen Oct 01 '12 at 16:21
  • @Sepala That sounds like a whole new stack overflow question. :) A schema version table is useful, and if that doesn't exist then you know you're on a brand new database. The version table will also help you upgrade databases for new versions of your program. – BillRobertson42 Oct 01 '12 at 16:31
  • however, if I use that URL you gave, I can move my DB from one place to another, double click it and open too, without any DB configuration manually right? Yes, as you asked, that's what I want. I know each and every machine will keep a seperate copy, but that's what I need. I don't need a server side one like MS SQL Server, which cannot be moved. So, this is it right? – PeakGen Oct 01 '12 at 17:10
  • Yes. I have a couple of apps like that. It's a great way to go if that's what you need. – BillRobertson42 Oct 01 '12 at 22:21