12
Nov
07

Problem in writing RMI-database application, but it solved today :)

Dari hari jumat kemaren saya nulis aplikasi database sederhana tapi nerapin RMI di dalamnya, untuk manggil method yang berfungsi untuk melakukan beberapa proses ke database. Dari hari jumat ketemu masalah dan stuck di situ, connection variabel yang sial itu selalu null. Hari ini dah ketemu pemecahannya, satu dari sekian cara mungkin 😦

Sebelum lanjut berikut ini pemahaman saya tentang RMI, RMI itu di pake memanggil method yang ada di komputer lain (bisa jadi server) secara remote. Untuk memakai suatau method sebenarnya saya cukup membuat object dari class yang memiliki method yang ingin dipakai dan memanggil method itu via object tsb. Tapi bagaimana klo method tersebut ada di komputer lain? Karena itulah saya pake RMI. Bagaimana teori kerjanya secara masih sedang dipelajari. Nanti saya tulis dipost selanjutnya. Ok lanjut…

Editor yang saya pake NETBEANS 5.5 dengan JDK 1.5

Ini model tabel database-nya dari app yang dibuat:

table.png
Berhubung saya juga nerapin arsitektur MVC maka saya buat modelnya(setter/getter) dulu:

Code:


package model;

import java.io.Serializable;

/**

*

* @author JollkY

*/

public class Book implements Serializable {

	private int id;
 	private String title;
	private int page;
	private String publisher;

	private String writer;</font>

	/** Creates a new instance of Book */
	public Book() {

	}

	public int getId() {
		return id;
	}

	public void setId(int id) {

		this.id = id;

	}

	public String getTitle() {

		return title;

	}

	public void setTitle(String title) {

		this.title = title;

	}

	[........ source lengkapnya di http://www.4shared.com/file/29059871/5faf7c8/src.html .......]
}

Sebelum lanjut untuk membuat controller dan DAO-nya, diperlukan design method-nya dulu dalam suatu interface sehingga untuk controller dan DAO-nya tinggal implements aje gitu.Code: package design;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.List;
import model.Book;

/**
*
* @author JollkY
*/
public interface dataAccessObject extends Remote {
public int saveBook(Book objBuku) throws RemoteException;
public int deleteBook(int idBuku) throws RemoteException;
public int editBook(Book objBuku) throws RemoteException;
public List<Book> getAllBook() throws RemoteException;
public Book getBookById(int id) throws RemoteException;
public Book getBookByTitle(String title) throws RemoteException;
public Book getBookByWriter(String writer) throws RemoteException;
}

err… dari listing method yang ada di interface itu, saya baru buat coding lenkap untuk method getAllBook(), yang lainnya blum. Blum sempat aja. Selanjutnya adalah buat File koneksi dolo.

Code:

package Connection;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
*
* @author JollkY
*/
public class DBConnection {
private Connection con = null;
private String DRIVER = “com.mysql.jdbc.Driver”;
private String URL = “jdbc:mysql://localhost:3306/mybook”;
private String USER = “binsus”;
private String PASS = “phpBB2”;
/**
* Creates a new instance of DBConnection
*/
public DBConnection() {
if(con==null) {
try {
Class.forName(DRIVER).newInstance();
this.con = DriverManager.getConnection(URL, USER, PASS);
} catch(Exception ex) {
ex.printStackTrace();
}
}
}

public Connection getConnection() {
return this.con;
}

[…..Source lengkap di sini…..]
}

Abis itu buat code untuk controller dan DAO. Controller dan DAO ini yang merupakan implement dari interface dataAccessObject, nantinya di letakkan di sisi server yang dipakai server untuk membuat koneksi dan melakukan akses ke database.

Berikut code controller

Code:

package controller;

import Connection.DBConnection;
import dao.BookDao;
import design.dataAccessObject;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.List;
import model.Book;

/**
*
* @author JollkY
*/
public class BookController implements dataAccessObject {

/** Creates a new instance of BookController */
public BookController() throws RemoteException {
UnicastRemoteObject.exportObject(this);
}

public int saveBook(Book objBuku) throws RemoteException {

return 0;
}

public int deleteBook(int idBuku) throws RemoteException {

return 0;
}

public int editBook(Book objBuku) throws RemoteException {

return 0;
}

public List<Book> getAllBook() throws RemoteException {
List<Book> listBook = new ArrayList<Book>();
DBConnection con = new DBConnection();
BookDao dao = new BookDao(con.getConnection());
listBook = dao.getAllBook();
return listBook;
}

[…..Source lengkap di sini….]
}

berikut code DAO,

Code:

package dao;

import Connection.DBConnection;
import design.dataAccessObject;
import java.rmi.RemoteException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import model.Book;

/**
*
* @author JollkY
*/
public class BookDao implements dataAccessObject {
private Connection con = null;
private PreparedStatement st = null;
private ResultSet rs = null;
int sukes = 0;

/** Creates a new instance of BookDao */
public BookDao(Connection con) {
this.con = con;
}

public int saveBook(Book objBuku) throws RemoteException {

return 0;
}

public int deleteBook(int idBuku) throws RemoteException {

return 0;
}

public int editBook(Book objBuku) throws RemoteException {

return 0;
}

public List<Book> getAllBook() throws RemoteException {
String query = “SELECT * FROM buku”;
List<Book> daftarBuku = new ArrayList<Book>();
if(this.con==null) {
System.out.println(“Con null”);
}
try {
this.st = this.con.prepareStatement(query);
this.rs = this.st.executeQuery();
while(this.rs.next()) {
Book b = new Book();
b.setId(this.rs.getInt(1));
b.setTitle(this.rs.getString(2));
b.setPage(this.rs.getInt(3));
b.setPublisher(this.rs.getString(4));
b.setWriter(this.rs.getString(5));

daftarBuku.add(b);
}
} catch (SQLException ex) {
ex.printStackTrace();
}
return daftarBuku;
}

[….sorce lengkap di sini….]

}

Code untuk server

Code:

package Server;

import controller.BookController;
import design.dataAccessObject;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

/**
*
* @author JollkY
*/
public class ServerBook {

/** Creates a new instance of ServerBook */
public ServerBook() {
try {
// String name = “dataAccessObject”;
dataAccessObject bookController = new BookController();
// dataAccessObject stub = (dataAccessObject) UnicastRemoteObject.exportObject(bookController, 0);
// Registry regist = LocateRegistry.getRegistry();
// regist.rebind(name, stub);

Naming.rebind(“dataAccessObject”, bookController);
System.out.println(“Server Ready”);
} catch(Exception ex) {
ex.printStackTrace();
}
}

public static void main(String[] args) {
new ServerBook();
}

}

Naming.rebind(“dataAccessObject”, bookController); – berguna untuk melakukan remote call ke RMI registry yang ada di localhost.

Code untuk client

Code:

package Client;

import controller.BookController;
import design.dataAccessObject;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.List;
import model.Book;

/**
*
* @author JollkY
*/
public class Tester {

/** Creates a new instance of Tester */
public Tester() {
}

public static void main(String[] args) {
try {
//Registry regis = LocateRegistry.getRegistry();
//dataAccessObject dataBuku = (dataAccessObject) regis.lookup(“dataAccessObject”);

Object obj = Naming.lookup(“dataAccessObject”);
dataAccessObject dataBuku = (dataAccessObject) obj;
// BookController dataBuku = new BookController();

List<Book> allBook = dataBuku.getAllBook();
// System.out.println(allBook);
for(Book b:allBook) {
System.out.println(b.getId());
System.out.println(b.getTitle());
System.out.println(b.getPage());
System.out.println(b.getPublisher());
System.out.println(b.getWriter());
System.out.println(“======================”);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}

}

Naming looku, untuk melihat apakah di dalam rmiregistry ada object dengan nama “dataAccessObject”. Obect ini sebenarnya bertipe dataAccessObject, tetapi saat “diambil” dari rmiregistry dia kehilangan tipe datanya. Untuk perlu dilakukan casting

dataAccessObject dataBuku = (dataAccessObject) obj;

Compiling and Running…

1. Lakukan hal berikut. Klik kanan pada nama project -> pilih Properties -> klik menu Run -> Browse main class -> pilih class server (“ServerBook” untuk app saya). Hal ini berguna untuk memberitahukan pada java, untuk menjalankan class ini saat saya mengeksekusi file .jar -nya.

2. Compile fil-file tersebut

compiling.png

3. Buat class stub dan skeleton -nya.

stub_skel.png

4. Jalankan rmregistry. Lakukan ini dalam folder src, sebab akan gagal saat menjalankan server jika dilakukan di luar folder src. Blum tau juga apa sebabnya T.T

start_rmi.png

5. Pindah ke folder dist dan eksekusi file .jar -nya

run_jar.png

6. Eksekusi file file client

done.png

Hampir lupa ini struktur project di netbean -nya

struct.png

Masalah yang saya temukan adalah saat saya menjalankan server sama dengan cara menjalankan client, variabel connection selalu null. Tapi setelah melakukan point 1 dan point 5 server berjalan dengan lancar. Dan jangan lupa pada class Book perlu implements Serializable. 🙂

Link download http://www.4shared.com/file/29059871/5faf7c8/src.html

that’s all for today, Gracias 🙂

Advertisements

2 Responses to “Problem in writing RMI-database application, but it solved today :)”


  1. 1 syrita
    March 29, 2008 at 8:26 pm

    Saya punya problem begini:

    1. database server menggunakan mysql
    2. aplikasi sy buat menggunakan c++ dng component myDAC

    nah klo aplikasi dijalankan dlm intranet semua tdk masalah normal saja.

    yg menjadi masalah adalah pd waktu mengakses data mysql yg di host ditempat lain
    beda IP dan beda jaringan (lewat jaringan internet) masalah baru timbul:
    YAITU: akses database menjadi lambat banget…. bikin stress nunggunya…
    pada hal baru jg login belum akses data dll.

    Utk sample sy akses data menggunakan mySQLQueryBrowser tools dr mysql.org
    sy baru mencari informasi bgm caranya aplikasi dapat dng cepat mengakses database mysql
    sy baca informasi di blog ini. cuman blm paham benar.
    Apakah dengan cara dan teknologi RMI hal ini dapat diatasi?

    mohon sarannya.

    Jika iya bisakah sy meminta sample code-nya. tidak eprlu semuanya. cukup bagian proses koneksi dan input data selebihnya saya kembangkan sendiri gt.

    ok. trimakasih.

  2. 2 n3tg33ks
    March 31, 2008 at 5:00 am

    Untuk bahasa C yah…?
    Saya kurang tahu tentang penerapan teknologi Remote Method Invocation di C/C++.
    Menggunakan RMI untuk menyelesaikan masalah anda mungkin saja, tapi cari tau dulu penyebab kenapa akses data lambat.
    Saya pakai teknologi RMI untuk pengembangan sistem terdistribusi, sehingga proses”nya dapat dikerjakan secara terpisah, ini salah satu kegunaannya saja.
    mungkin saja konsepnya tidak jauh berbeda.
    maap yah saya tidak bisa banyak membantu.

    Thanks… 😈


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s


%d bloggers like this: