Avatar billede axe2 Nybegynder
21. januar 2004 - 22:05 Der er 5 kommentarer og
1 løsning

Singleton variant

Jeg har en database pool jeg ønsker skal være en singleton klasse, jeg har lavet denne klasse og jeg ved godt at den ikke overholder mønstreret 100 % som beskrevet i bøgerne, men virker getInstance() ikke efter singleton mønsteret, altså returnerer kun et og kun det samme objekt hver gang. Grunden til jeg spørger er netop p.g.a af varitionen.

virker det efter mønsteret ?

klassen kommer her.

package test;
import org.firebirdsql.jdbc.FBWrappingDataSource;


import java.sql.SQLException;

import javax.resource.ResourceException;
/**
* DOCUMENT ME!
*
* @author $author$
* @version $Revision$
*/
public class FBWrappingDataSourceSingleton {
    private static final String DATABASEURL =
        "localhost/3050:C:\\Programmer\\IBOConsole\\TEST";
    private static final int IDLE_MINS = 30;
    private static final int MIN_CONNECTIONS = 5;
    private static final int MAX_CONNECTIONS = 40;
    private static final int MAX_SIM_CONNECTIONS = 20;
       
        private static FBWrappingDataSource fbwds;
        //singleton object
        private static FBWrappingDataSourceSingleton singleton;
    /**
    * Constructor for FBSingletonConPool.
    */
    private FBWrappingDataSourceSingleton() {

        try {
            fbwds = new FBWrappingDataSource();
        } catch (ResourceException e) {
            System.err.println(e.getMessage());
            e.printStackTrace();
        }

        fbwds.setDatabase(DATABASEURL);

        // an old format version of the same url
        // fbwds.setDatabase("localhost/3050:/dir1/subdir/myDatabase.gdb");
        fbwds.setUserName("sysdba");

        fbwds.setPassword("masterkey");

        fbwds.setIdleTimeoutMinutes(IDLE_MINS);

        fbwds.setPooling(true);

        // this turns on pooling for this data source. Max and min must be set.
        fbwds.setMinSize(MIN_CONNECTIONS);

        // this sets the minimum number of connections to keep in the pool
        fbwds.setMaxSize(MAX_CONNECTIONS);

        // this sets the maximum number of connections that can be open at one time.
        try {
            fbwds.setLoginTimeout(MAX_SIM_CONNECTIONS);
        } catch (SQLException e) {
            System.out.println("Could not set Login Timeout in SQLDriver\n");
        }
    }

    /**
    *
    *
    * @return DOCUMENT ME!
    */
    public static synchronized FBWrappingDataSource getInstance() {
        if (singleton == null) {
            singleton = new FBWrappingDataSourceSingleton();
        }
        return fbwds;
    }
}
Avatar billede arne_v Ekspert
21. januar 2004 - 22:15 #1
Det burde virke ja.

Men hvorfor ikke lave det mere "standard" ?

private static FBWrappingDataSource fbwds;
->
private FBWrappingDataSource fbwds;

    public static synchronized FBWrappingDataSource getInstance() {
        if (singleton == null) {
            singleton = new FBWrappingDataSourceSingleton();
        }
        return fbwds;
    }
->
    public static synchronized FBWrappingDataSourceSingleton getInstance() {
        if (singleton == null) {
            singleton = new FBWrappingDataSourceSingleton();
        }
        return singleton;
    }

og tilføj:

public FBWrappingDataSource getDS() {
    return fbwds;
}
Avatar billede arne_v Ekspert
21. januar 2004 - 22:17 #2
Og så bruge:

FBWrappingDataSourceSingleton.getInstance().getDS()
Avatar billede axe2 Nybegynder
21. januar 2004 - 22:28 #3
Yep, det var lige det jeg manglede smid et svar, tak for svaret. Et mindre bispørgsmål omkring fbwds, hvorfor ændrer du den til ikke statisk, er det fordi at singleton i sig selv er statisk og dermed altid har den samme fbwds reference, syntes at af og til er svært at greje statisk kontra ikke statisk, nå men smid et svar, og tak for hjælpen
Avatar billede arne_v Ekspert
21. januar 2004 - 22:32 #4
svar
Avatar billede arne_v Ekspert
21. januar 2004 - 22:38 #5
Traditionelt laver man en singletons normale medlems variable instans variable
(ikke static).

Det virker også fint, da der jo kun er en instans.

Begrundelsen må bl.a. være at et singleton objekt netop er et objekt med
attributter tilknyttet instansen og at det ikke ændres af at der kun er
1 instans.
Avatar billede arne_v Ekspert
24. januar 2004 - 21:32 #6
Har du iøvrigt læst min artikel om singleton ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester