polaczenie z oraclem xe

0

witam mam kod:

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


public class baza {
	void polaczenie_z_baza() throws SQLException {
	    try {
	        Class.forName("oracle.jdbc.driver.OracleDriver");    
	        System.out.println("Połączyłeś się z bazą");        
	    } catch (Exception e) {
	        System.out.println("Nie połączyłeś się z bazą");
	    }
	    Connection polaczenie=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:8080:xe","system","zgred");
	} 
public static void main(String[] args){
	baza b=new baza();
	try {
		b.polaczenie_z_baza();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}
}

i niestety nie dziala.
korzystam ze sterownika ojdbc14.jar, classpath dodany. Moze sterownik ktorego uzywam jest nie odpowiedni? kod bledu wyraznie na to wskazuje...cUzywam jre1.5.0_06.

Nie połączyłeś się z bazą
java.sql.SQLException: No suitable driver
	at java.sql.DriverManager.getConnection(Unknown Source)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at baza.polaczenie_z_baza(baza.java:14)
	at baza.main(baza.java:19)

pozdrawiam

0

Czy w classpathie na pewno masz odpowiedniego jara z driverem? Pod IDE może działać, ale po uruchomieniu już nie, bo IDE zazwyczaj konfiguruje sobie cp. Sprawdź dokładni próbując stworzyć nową instancję Driver przez:

Driver driver = new OracleDriver();
0

hmmm tak dodalem tylko ze w opcjach mojego komputera, a jest tez gdzies w eclipsie mozliwosc dodania do projektu a nie moge znalezc:) musi byc i tu i tu?

0

ale czy przypadkiem jesli by to byl problem z classpath to nie dostalby komunikatu ktory wyswietlany jest w catchu od Class.forName? tutaj wyraznie dostaje komunikat juz zDriverManagera, czyli przeszedl ladowanie klasy? nie wiem jak rozwiazac problem bo nie znam tych driverow, ale przynajmniej mozna wykluczyc problem z classpath, tak mysle przynajmniej?
pozdrawiam i mam nadzieje ze to nie projekt zaliczeniowy i swietamijaja w spokoju
how how how

0

Hm... rzeczywiście to może być coś innego. Można spróbować też w taki sposób:

try {
        DriverManager.registerDriver( new oracle.jdbc.driver.OracleDriver());
}
catch (SQLException e ){
       e.printStacktrace();
}
0

w eclipse:
prawym na projekt i "build path" lub "java build path" lub podobnie, pojawia sie dialog z kilkoma zakladkami, wsrod nich jest cos w stylu "lexternal libraries", dodajesz tam twojego jara i ok
mowie "cos jakby, w stylu..." itp poniewaz dokladny opis zalezy od wesji eclipsa jaka uzywasz
co do tego czy trzeba tu i tu: rozumiem ze masz classpath ustawione systemowe, w zmiennych srodowiskowych? jesli tak to widocznie trzeba i tu i tu skoro nie dziala :-)

pozdro

0

dodalem jara jak mamalyga kazales i jest ok..prawie :D ale to juz bledy sqla wiec jak sadze trzeba mu cokolwiek kazac robic na tej bazie.

Połączyłeś się z bazą
java.sql.SQLException: Wyjątek we-wy: The Network Adapter could not establish the connection
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255)
	at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387)
	at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:420)
	at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
	at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
	at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at baza.polaczenie_z_baza(baza.java:18)
	at baza.main(baza.java:23)

a nie przepraszam juz jest ok, przyzwyczajony ze proces serwera chodzi caly czas nie sprawdzilem a tu zlosliwosc rzeczy martwych serwer nie wystartowal :)

offtop no niestety to projekt zaliczeniowy...mam napisac system obslugi fabryki samochodow (sic! :)) wczesniej pisalem miedzy innymi szachy itp. Nie moge sie do tej javy przekonac od ponad 2 lat.

0

@Freakman, jedna rada. Czasami zamiast JDBC warto pomysleć o jakimś prostym ORMie. JPA może chodzić bez kontenera lub serwera aplikacji. Odpadną ci wtedy problemy z SQLem :)

ps. do javy nie mogłem się przekonać do momentu aż nie zacząłem z nią pracować po 12 godzin dziennie i nie przeczytałem o kilku rozwiązaniach.

0

@koziolek - JPA tak, no ale musi miec jakiegos providera tak czy tak, co drugi powie tutaj hibernate, a zalezy co on potrzebuje - jak to sie mowi nie ma co wyciagac armaty na muche - ja w hibernacie i innych pisalem na prawde sporo, ale w domowym zaciszu pisalem gierki i male appsy ktore mialy bazodanowosci tyle co kot naplakal i zwykly jdbc spisywal sie doskonale i starczyl z nadmiarem
pewnie ten projekt zaliczeniowy to tez kilka tabelek i tyle samo zapytan itp wiec nie ma co mieszac za bardzo z tymi orm
kolejna rzecz ze takie orm to sterta xml lub anotacji z konkretna skladnia, ktorych tez trzeba sie nauczyc, a jak to student co robi w swieta projekt to pewnie wiele czasu mu na zdanie go nie zostalo ;-)
no i na koniec - orm nie wlaczy mu servera, a miszmasz z classpath i jarami wiekszy o 1000%, bo powszechny hibernate ma zaleznosci mnostwo

0

@mamalyga, konfiguracja JPA jest naprawdę banalna, a jak używasz Javy 6 to można, jako domyślną, ustawić bazę DerbyDB. Zalezność od providera można sobie skonfigurować w Mavenie i problem z jarami odpada. Jak na koniec potrzebujemy wszystko ładnie spakować to można użyć maven-jar-plugin i po porblemie.

0

maven - kolejna rzecz do nauki a przynajmniej do poczytania troche co i jak
no ale masz racje,nie jest najgorzej, tylko patrz przez pryzmat studenta spieszacego sie z projektem
a moze to tylko ja tak mam ze czasami musze o czyms poczytac zanim zaczne uzywac?

0

Na początek musisz zawsze poczytać, ale ostatnio czytałem "Better Builds with Maven" i na zakończenie 2 rozdziału jest zdanko o mniej więcej takim sensie, że jeżeli chcesz tylko używać mavena to na tym możesz zakończyć lekturę. Zresztą lubię programować z manualem w ręku.

0

tak sie zawsze zastanawiam koziolek jak czytam Twoje posty ktore zycie z kolei masz ze taka wiedza dysponujesz :) ja mam lekko chore ambicje staram sie rozwijac a nijak do przodu nie idzie (chyba niezbyt utalentowany jestem w tym kierunku) ale do rzeczy:

java.sql.SQLException: Wyjątek we-wy: Got minus one from a read call

co z tym mozna zrobic bo grzebie w googlach pelno watkow jest o tym a rozwiazania znalezc nie mozna.

0

Co najmniej kilka przyczyn takiego błędu. Najbardziej prozaiczne to nieprawidłowe zapytanie. Na tym kończą się prozaiczne problemy. Problemy pojawiają się zazwyczaj przy połączeniu z bazą. Albo oracle zrobił kaput z powodu zbyt dużej liczby połączeń - sprawdź czy wszystkie są prawidłowo zamykane, niegłupie jest dodanie close() w metodzie finalize(), w najgorszym przypadku poleci wyjątek przy niszczeniu obiektu. Albo przekroczona została liczba procesów przydzielonych Oraclowi z powodu punkt poprzedni. Albo też sesja została "zawieszona" z powodu braku procesu :)
Generalnie wszystko sprowadza się do za dużej liczby połączeń z bazą. Przyczyną może być:
a. wyciek połączenia - najlepsza metoda to zarządzanie połączeniem jako singletonem. Dość ogólnie o tym http://4programmers.net/Forum/viewtopic.php?id=117923 wraz ze szkieletem implementacji DAO. Zresztą napisz obiekt DAO do obsługi zapytań. Ułatwi życie, bo można będzie go przetestować. Zresztą tam to wypłynęło przy zarządzaniu połączeniami i powiązaniu tego z akcjami użyszkodnika.
b. zła konfiguracja bazy - tu ci mogę jedynie podpowiedzieć, że gdzieś siedzi pula połączeń. Oracla nie znam, ale poznam za niedługo... niestety...

Znalazłem jeszcze jedno źródło, czyli niekompatybilność sterownika z wersją bazy. Sprawdź czy wszytko jest git w tym względzie.

Co do życia to po prostu miałem farta uczestniczyć w kilku nietypowych projektach. Do tego czytam ogromne ilości książek (co rodzice i narzeczona mają mi za złe bo się z nimi nie mieszczę w domu). Do tego dochodzi natura kombinatora i tendencja do zadawania pytań.

0

na razie nie wykonuję zadnych zapytan, bo program sie wywala wlasnie na lini getConnection :). Sterownik jest odpowiedni, zamykanie polaczenia wrzucilem w finally, co do DAO musze jak widze troche poczytac.
co do konfiguracji bazy - mozliwe bo xe dziala jak instalka windowsa, praktycznie wszystko wykonuje sie samo :)

edit:
ok wstyd.. port nie 8080 tylko 1521. tak to jest z brakiem doswiadczenia :)

0

co do obslugi polaczenia singletonem:

skad moge wiedziec ze garbacecollector nie zwinal mi obiektu i tak naprawde uzywam wciaz tego samego? Wrzucilem do finalize polaczenie.close i przy nastepnych probach przypisania instancji okazuje sie ze poprzedni obiekt zostal wyrzucony (i jednoczesnie polaczenie zamkniete). Jak utrzymywac polaczenie z baza przez caly okres trwania programu?

0

@Freakman, chyba nie do końca kumasz jak działa singleton i gc. W najprostszym przypadku wygląda on w ten sposób:

class Singleton{
    private static Singleton INSTANCE = new Singleton();
    private Singleton(){}
    public static Singleton getInstance(){
        return INSTANCE;
    }
}

i teraz co się dzieje. Przy ładowaniu klasy wywoływany jest konstruktor ponieważ trzeba ustawić pole INSTANCE. W tym momencie zostaje stworzony obiekt singletonu i przypisany do zmiennej. Co robi gc? Gc trafia co pewien czas na obiekt singletonu i sprawdza czy kierują do niego jakieś referencje. Jako, że na początku do pola INSTANCE został przypisany obiekt i pole to jest statyczne to gc cały czas ma conajmniej jedną referencję do obiektu. Ergo, singleton jest niszczony w przypadku kończenia pracy programu, a w trakcie jego działania jest obecny cały czas jeden i ten sam obiekt.

0
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import oracle.jdbc.driver.OracleDriver;

public class DBConnector {
		//private static DBConnector INSTANCE=new DBConnector();
        private static Connection CONNECTION_INSTANCE;
        public static Connection polaczenie;
        static int licznik=0;
        private DBConnector() {
        	 try {
      	        Class.forName("oracle.jdbc.driver.OracleDriver");   
      	        System.out.println("Połączyłeś się z bazą");        
      	    } catch (Exception e) {
      	        System.out.println("Nie połączyłeś się z bazą");
      	    }
      	    
      	    
 			try {
 				polaczenie = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe","SYSTEM","qwe123");
 			} catch (SQLException e) {
 				e.printStackTrace();
 			}
        }

        public static void init(Properties properties) throws SQLException{
               
     	} 
        

        public static Connection getCONNECTION_INSTANCE() {
                if (CONNECTION_INSTANCE == null){
                	licznik=licznik+1;
                	
                	new DBConnector();
                }
                System.out.println(licznik);
                return CONNECTION_INSTANCE;
        }

        @Override
        protected void finalize() throws Throwable {
                // Połączenie jest zamykane w momwncie niszczenia obiektu
                CONNECTION_INSTANCE.close();
        }
}

czy bardzo narusze zasady tworzac publiczne statyczne polaczenie tak zeby pozniej wygodnie obslugiwac zapytania sql z innych klas?:) bo to proste i dla mnie logiczne ale cos czuje ze lamie zasady obiektowe.

0

muszę przyznac ze tez wlasnie miałem problem z połączeniem sie javą do bazy oraclowej ale ten topic rozwiał wszystki moje pytania :) no moze poza jednym ...

Pytanie raczej do Koziołka, choć moze Freakman tez zna rozwiazanie :) mianowice zrobilem sobie potrzebny interfejsik w javie mam juz polaczenie z baza zrobilem sobie proste zapytanie do bazy

select name from pracownicy;
//tak zebym sie nie przemeczal ;)

i ładnie mi się wyswietla w konsoli .cmd teraz chciałbym zeby wynik mi sie wyrysował w javie w stworzonym panelu czy textarea (o ile jest taka możliwość) i tu pytanie

czy jest taka możliwość zeby to ładnie w javie wyświetlić :> jeśli tak to jaka :> mile widziany przykład lub jakas ogolnie dostępna ksiazka :)

0

Jest możliwość żeby wyświetlić ładnie. Trzeba skorzystać z klasy JTable (do rysowania tabeli). Mniej ładnie, to w JTextArea (TextArea). Jeżeli na konsoli wyświetlałeś tak: System.out.println(s); gdzie s było zbudowane
z jednego wiersza w ResultSet, to zamiast tego użyj ta.append(s+"\n");

0

@Freakman, praktycznie publiczne i statyczne połączenie narusza zasadę enkapsulacji. Ponad to może być źródłem wrednych błędów:

DBConnector.polaczenie = null;

i już leży cała aplikacja. Ponieważ wszystkie odwołania są statyczne wiec tego typu błąd, lub też kod złośliwy, ładnie "wynulluje" całą sesję. Innym i bardziej prawidłowym podejściem jest:

private static Connection polaczenie;

public static Connection getPoloczenie(){
   return polaczenie;
}

W ten sposób nie ma bezpośredniej metody na ustawienie tego pola z poza obiektu.

@loko0709, przejrzyj:
http://www.java-tips.org/java-se-tips/javax.swing/how-to-show-data-in-database-with-a-jtable.html

0

dzieki panowie za odpowiedz, fakt jest jak byk w swingu JTable nie wiem czemu wczesniej tego nie widzialem :)

ale tutaj mam kolejne pytanie, mianowice do wyswietlania w nim wyników - nie mowie tutaj o wyswietlaniu wyniku w taki sposob

String[] columnNames = {"First Name",
                                "Last Name",
                                "Sport",
                                "# of Years",
                                "Vegetarian"};

        Object[][] data = {
            {"Mary", "Campione",
             "Snowboarding", new Integer(5), new Boolean(false)},
            {"Alison", "Huml",
             "Rowing", new Integer(3), new Boolean(true)},
            {"Kathy", "Walrath",
             "Knitting", new Integer(2), new Boolean(false)},
            {"Sharon", "Zakhour",
             "Speed reading", new Integer(20), new Boolean(true)},
            {"Philip", "Milne",
             "Pool", new Integer(10), new Boolean(false)}
        };

bo kazdy potrafi sie napisac ja potrzebuje wczytac dane z tabeli za pomoca jakiegos selecta (np select imie, nazwisko from pracownicy) i umiescic go w naszej tabeli, i tu pojawia sie moje pytanie jak z tym sie uporac bo mecze sie i mecze i rozwiazania nie widze [glowa]

ja kombinuje w tą strone - moze cos was natchnie czytajac to

String sql      = "select imie, nazwisko from klienci";  //selekcik
Connection conn;
       Statement  stmt;
       ResultSet  rset; 
 String connString = driver + "@" + host + ":" + port + ":" + SID ;
........  
DriverManager.registerDriver( new oracle.jdbc.driver.OracleDriver()); 
        conn = DriverManager.getConnection( connString, user, password);        
        stmt = conn.createStatement();
        rset = stmt.executeQuery( sql);
...

while (rset.next()) {     //tutaj pobieramy dane z naszego selecta 
           tab.append(rset.getObject("imie") + "\t" + rset.getObject("nazwisko") + "\n");  //wyswietlenie danych za pomoca sposobu "brzydkiego" 
            imie = rset.getObject("imie");  //pobieranie z oracla do stringów
            nazwisko = rset.getObject("nazwisko");
                imiet[i]=imie.toString();   //pobieranie ze stringow do tablic
                nazwiskot[i]=nazwisko.toString();
                i++;
            }   

teraz jak juz mamy zrobionego selecta probujemy wyswietlic dane w tabeli

              String[] columnNames = {"Imię", "Nazwisko"};                          
                Object[][] data = {{imiet[i],nazwiskot[i]}};
                table = new JTable(data,columnNames);
                scrollPane = new JScrollPane(table);
......
placem1.add(scrollPane);

jak widac na załączonym obrazku kod moze wyswietlic tylko jeden rekord a jak wczytac cala tabele wierszy??

0

I tu pojawia się znowu temat DAO i obiektów pomocniczych. Załóżmy, że masz już zdefiniowany interfejs CrudDAO jakąś implementację. Niech metoda read() ma taką definicję:

public List<Osoba> read(Osoba o){
  // tu SQL, JPA inny ORM
}

dane wybierasz za pomocą tej metody i tylko tej metody. Następnie przygotuj sobie drugą metodę w jakimś obiekcie - narzędziu który zrobi coś takiego:

public Object[] makeRowFromOsoba(Osoba o){
   return new String[]{o.getImie(), o.getNazwisko()};
}

Wystarczy zatem teraz zrobić coś mniej więcej takiego:

List<Osoba> osoby = osobaDAO.read(Osoba przykladowaOsoba);
Object[][] rows = new Object[osoby.size()][];
for (int i = 0; i< osoby.size(); i++){
   rows[i] = makeRowFromOsoba(osoby.get(i));
}

jest to kncepcja więc trzeba to ugładzić.

0

ok dzieki za opowiedz wypróbuje koncepcje jak z pracy wrocę a powiedz mi dwa słowa o interfejsie CrudDao bo pierwszy raz sie z tym spotykam ...

ps mam tez koncepcje jak to zrobic w "tradycyjny" sposób tj;

public int getRowCount() { //liczymy wiersze danych
        return dane.length;
}
...
public void dodajWiersz(Object[] row) {
Object[][] data=new Object[dane.length+1][columnname];  //zwiekszenei ilosci wierszy o 1 w tabeli

for(int i=0; i<dane.length; i++)
                    for(int j=0; j<columnname;j++)
                            nowedane[i][j]=dane[i][j];

            for(int i=0; i<columnname; i++)
                            nowedane[dane.length][i] = row[i];
            this.dane=nowedane;  //zapisujemy nowa macierz w miejsce starej
            fireTableRowsInserted(dane.length-1, dane.length-1);
    }

jeszcze nie wiem dokladnie jak to mi wyjdzie bo robie to pierwszy raz (nie ukrywam ze podobne rozwiazanie widzialem tu na forum dopiero)

0

CrudDAO nie jest interfejsem w sensie Javy,ale pewną koncepcją (nie wzorcem, choć można by go tak traktować). Generalnie polega to na tym, że definiujesz pewien interfejs Javowy, którego implementacja zapewnia cztery funkcjonalności związane z bazami danych:
Create - tworzenie rekordów
Read - czytanie rekordow
Update - aktualizacja rekordu
Delete - usuwanie rekordu

Cały myk polega na tym, że wszelkie operacje na bazie danych są przeporwadzane przez ten interfejs. Zatem uniezależniasz się od konkretnej implementacji bazy. Zatem każdy obiekt modelu można wyposarzyć w obiekt DAO implementujący CrudDAO i po przetestowaniu w jednym miejscu możesz już pisać za pomocą interfejsów.

0

ok dzieki koziolek za rade, ostatnio moglem bawic sie tym nocami tylko i szlo mi jak krew z nosa :) w kazdym razie juz mi wszystko dziala i dla reszty userow przegladajacych to forum po poludniu wkleje te metody ktore umozliwiaja dodawanie wierszy :)

0

bylo by bardzo milo loko0709. Ja jestem tak skolowany po kolejnych godzinach siedzenia nad projektem (zmianie wszystkiego z 10 razy) plus wykladzie z inzynierii i ogarnieciu nowych wzorcow(z kazdego po trochu mi pasuje) ze chce spytac o cos a nie wiem jak sformulowac pytanie.

Koziolek: prosba o jakis link do prostej implementacji DAO. Widze ze jest to eleganckie rozwiazanie ale nie wiem za bardzo jak cos takiego zaimplementowac a w googlach jakies nie zrozumiale cuda :) na razie czuje sie jakby moj program byl scenariuszem...chce go troche usamodzielnic. (to projekt z inzynierii programowania wiec chodzi glownie o jakosc kodu - nie tak jak jestem przyzwyczajony - jak dziala to nie ruszac:)).

Jeszcze pytanie: Jesli chce przeslac nie okreslona z gory liczbe obiektow z serwera (np spis klientow jakiejs firmy) to bedzie to najwygodniej bedzie to zrobic przesylajac kolekcje czy moze jest jakies inne rozwiazanie? (nie wiem jak przeskoczyc nie wiadoma iloc obiektow - moze byc 1, moze byc 392 albo moze nie byc zadnego:/).

przepraszam za moje arcy niezrozumiale wypowiedzi [wstyd]

0

@Freakman, o implementację upomnij isę na pw bo jestem po koncercie Vadera i Behemotha i padam na twarz. Co do Pytania to można skorzystać z listy lub z seta. Wszytko jedno. Potrzebujesz tylko jakiegoś obiektu opakowującego (odradzam tablice bo są mało elastyczne)

0

Koledzy pomóżcie czemu nie udaje mi się załadować sterownika :-(

user image

Niby wszystko ok sterownik jest zainstalowany w NetBeans'ie a jednak kompilacja kodu zwraca błąd. Wszystko jest na foto.

0

Class.forName("oracle.jdbc.driver.OracleDriver")

1 użytkowników online, w tym zalogowanych: 0, gości: 1