473,651 Members | 3,007 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Few basic questions related to servlets

157 New Member
Helo experts,

I'm working on my first ever web application and I have some basic questions related to servlets if I may,

I have 5-6 Java statements and preparedstateme nts in my servlet to execute a number of MySQL queries for different tables, do I need to open a new connection to the database for each query or can I just create one connection and use it for all the queries?

Also, if I'm using a preparedstateme nt and resultset for a particular query, then after closing them both can I again reuse them for another query in the same piece of code or is it better to create a new statement/preparedstateme nt object for every different query and close all the resultsets and statements etc in the end of the doGet()/doPost() method?

I've been told to not declare a preparedstateme nt or a statement as global since that has something to do with multithreading, hence I create and use them in the doPost() or doGet(). What is the reason behind not declaring them as global if that program is going to be accessed by multiple users? Is it because the global copy will be shared by all or something else?

Does opening multiple connections on a database in the same program and using many statements/preparedstateme nts affect the performance in any way?

Why is it a good practice to close all the opened connections in destroy()? Will they still remain open even if the user closes the browser window(webpage) to which this servlet is linked?
Feb 19 '07 #1
14 2050
r035198x
13,262 MVP
Naturally the nature of these questions may require you to read a text. Even then you'll find whole books devoted to these things so whatever responses we are going to give here will not be complete.

I have 5-6 Java statements and preparedstateme nts in my servlet to execute a number of MySQL queries for different tables, do I need to open a new connection to the database for each query or can I just create one connection and use it for all the queries?
You do not need to open a connection for each statement. Just use one connection

Also, if I'm using a preparedstateme nt and resultset for a particular query, then after closing them both can I again reuse them for another query in the same piece of code or is it better to create a new statement/preparedstateme nt object for every different query and close all the resultsets and statements etc in the end of the doGet()/doPost() method?
Create a prepared statement for each different query. You cannot create more than one resultsets. You can only have one resultset so you have to reuse that resultset.

Does opening multiple connections on a database in the same program and using many statements/preparedstateme nts affect the performance in any way?
Naturally perfomance is reduced when multiple connections are open. The extent of the effects depend on the database being used and in some cases the OS. Using many statements has just about as much effect as having more String declarations in a program. It is the connection to the database and the queries that are really of effect.

Why is it a good practice to close all the opened connections in destroy()? Will they still remain open even if the user closes the browser window(webpage) to which this servlet is linked?
Closing a page linked to a servlet does not do anything to the servlet unless the page submits on close. Destroy is called when the application is being stopped or when the server is stopped so the connections are closed on application exit rather than on page exit because we can have some other pages that might still be open and may want to connect to the database. If we had closed the connections on closing one of the pages, then we would have to create another connection everytime which is not efficient.
Feb 20 '07 #2
abctech
157 New Member
Thank you so much for your detailed response r035198x , it clears a lot of my doubts.

One thing though, you mentioned
Create a prepared statement for each different query. You cannot create more than one resultsets. You can only have one resultset so you have to reuse that resultset..
I dint quite understand this part, I'm posting a few lines of my program.Can you please tell me if I'm using the ResultSet in the right way?

[Please note that this is just how my code looks in general, I couldn't post the original code due to some work policies]

Expand|Select|Wrap|Line Numbers
  1. doPost()
  2. {
  3.    try
  4.    {
  5.        String save = null;
  6.        save = request.getParameter("Save"); 
  7.  
  8.        String update = null;
  9.        update = request.getParameter("Update"); 
  10.  
  11.        String delete = null;
  12.        delete = request.getParameter("Delete"); 
  13.  
  14.        PreparedStatement pst = con.prepareStatement(selectBrID);
  15.        pst.setString(1,a);
  16.        ResultSet rs = pst.executeQuery();
  17.  
  18.        while(rs.next())
  19.        {
  20.     //some code 
  21.        }
  22.        rs.close();
  23.        pst.close();
  24.  
  25.        if(save.equals(“Save”))//if user hits 'Save' on page execute this 'if'.
  26.        {
  27.           PreparedStatement pst1 = con.prepareStatement(selectName);
  28.           pst1.setString(1,Name);
  29.           ResultSet rs1 = pst1.executeQuery();
  30.  
  31.           PreparedStatement pst2 = con.prepareStatement(selectUsername);
  32.           pst2.setString(1,Username);
  33.           ResultSet rs2 = pst2.executeQuery();
  34.  
  35.           if(rs1.next() != rs1.isLast())
  36.           {
  37.             pw.println(“This Name already exists”);  
  38.           }
  39.           else if(rs2.next() != rs2.isLast())
  40.           {
  41.            pw.println(“This Username already exists”);
  42.           }
  43.           else
  44.           {
  45.            PreparedStatement pst3 = con.prepareStatement(insertStr);
  46.            pst3.setString(1,Name);
  47.            pst3.setString(2,Username);
  48.            pst3.executeUpdate();    
  49.           }
  50.           rs1.close();
  51.           pst1.close();
  52.           rs2.close();
  53.           pst2.close();
  54.           pst3.close();
  55.  
  56.       }//’Save’ over
  57.  
  58.       if(update.equals(“Update”))//if user hits 'Update' on page execute this 'if'.  
  59.       {
  60.          //some PreparedStatements and ResultSets 
  61.          if()
  62.          {
  63.             //Again some PreparedStatements and ResultSets 
  64.          }
  65.          else if()
  66.          {
  67.            //Again some PreparedStatements and ResultSets  
  68.          }
  69.          else
  70.          {
  71.             PreparedStatement pst5 = con.prepareStatement(updateStr);
  72.             pst5.setString(1,Name);
  73.             pst5.setString(2,Username);
  74.             pst5.executeUpdate();        
  75.          }
  76.          //closing all the resultsets and pst’s.
  77.       }//’Update’ over
  78.  
  79.       if(delete.equals(“Delete”))//if user hits 'Delete' on page execute this 'if'.
  80.       {
  81.          PreparedStatement pst6 = con.prepareStatement(deleteStr);
  82.          pst6.setLong(1,UID);
  83.          pst6.executeUpdate();    
  84.          pst6.close();
  85.       }//’Delete’ over
  86.    }
  87.    catch(Exception e)
  88.    {
  89.        System.out.println(e);
  90.    }
  91.  }//doPost() over
The a, Name, Username strings are coming from the webpage. And depending on what button the user has clicked(Save/Delete/Update) the control goes into the appropriate 'if' and executes the queries there. I have created and used just one Connection(con) as you suggested but can I reuse the Prepared statements again since at one time the control shall enter & execute just one of the 3 main-if's.

And what about the Result sets, I'm creating a different one for every PreparedStateme nt, is it incorrect? Can you please tell me a little about how a Result set works?
Feb 22 '07 #3
r035198x
13,262 MVP
Thank you so much for your detailed response r035198x , it clears a lot of my doubts.

One thing though, you mentioned

I dint quite understand this part, I'm posting a few lines of my program.Can you please tell me if I'm using the ResultSet in the right way?

[Please note that this is just how my code looks in general, I couldn't post the original code due to some work policies]

Expand|Select|Wrap|Line Numbers
  1. doPost()
  2. {
  3. try
  4. {
  5. String save = null;
  6. save = request.getParameter("Save"); 
  7.  
  8. String update = null;
  9. update = request.getParameter("Update"); 
  10.  
  11. String delete = null;
  12. delete = request.getParameter("Delete"); 
  13.  
  14. PreparedStatement pst = con.prepareStatement(selectBrID);
  15. pst.setString(1,a);
  16. ResultSet rs = pst.executeQuery();
  17.  
  18. while(rs.next())
  19. {
  20.     //some code 
  21. }
  22. rs.close();
  23. pst.close();
  24.  
  25. if(save.equals(“Save”))//if user hits 'Save' on page execute this 'if'.
  26. {
  27. PreparedStatement pst1 = con.prepareStatement(selectName);
  28. pst1.setString(1,Name);
  29. ResultSet rs1 = pst1.executeQuery();
  30.  
  31. PreparedStatement pst2 = con.prepareStatement(selectUsername);
  32. pst2.setString(1,Username);
  33. ResultSet rs2 = pst2.executeQuery();
  34.  
  35. if(rs1.next() != rs1.isLast())
  36. {
  37. pw.println(“This Name already exists”); 
  38. }
  39. else if(rs2.next() != rs2.isLast())
  40. {
  41. pw.println(“This Username already exists”);
  42. }
  43. else
  44. {
  45. PreparedStatement pst3 = con.prepareStatement(insertStr);
  46. pst3.setString(1,Name);
  47. pst3.setString(2,Username);
  48. pst3.executeUpdate();    
  49. }
  50. rs1.close();
  51. pst1.close();
  52. rs2.close();
  53. pst2.close();
  54. pst3.close();
  55.  
  56. }//’Save’ over
  57.  
  58. if(update.equals(“Update”))//if user hits 'Update' on page execute this 'if'. 
  59. {
  60. //some PreparedStatements and ResultSets 
  61. if()
  62. {
  63. //Again some PreparedStatements and ResultSets 
  64. }
  65. else if()
  66. {
  67. //Again some PreparedStatements and ResultSets 
  68. }
  69. else
  70. {
  71. PreparedStatement pst5 = con.prepareStatement(updateStr);
  72. pst5.setString(1,Name);
  73. pst5.setString(2,Username);
  74. pst5.executeUpdate();        
  75. }
  76. //closing all the resultsets and pst’s.
  77. }//’Update’ over
  78.  
  79. if(delete.equals(“Delete”))//if user hits 'Delete' on page execute this 'if'.
  80. {
  81. PreparedStatement pst6 = con.prepareStatement(deleteStr);
  82. pst6.setLong(1,UID);
  83. pst6.executeUpdate();    
  84. pst6.close();
  85. }//’Delete’ over
  86. }
  87. catch(Exception e)
  88. {
  89. System.out.println(e);
  90. }
  91. }//doPost() over
The a, Name, Username strings are coming from the webpage. And depending on what button the user has clicked(Save/Delete/Update) the control goes into the appropriate 'if' and executes the queries there. I have created and used just one Connection(con) as you suggested but can I reuse the Prepared statements again since at one time the control shall enter & execute just one of the 3 main-if's.

And what about the Result sets, I'm creating a different one for every PreparedStateme nt, is it incorrect? Can you please tell me a little about how a Result set works?
This way should probably work. What I meant was you cannot open two resultsets at the same time. But better is declaring one resultset object before the try and intitializing it to null, then instantiate it differently for each of the if statements so that you use only one resultset variable.

You should close your connections and resultsets in the finally close so you are guaranteed they will be closed

May I say also that
Expand|Select|Wrap|Line Numbers
  1.  String save = null; 
  2. save = request.getParameter("Save"); 
  3.  
  4.  
is the same as

Expand|Select|Wrap|Line Numbers
  1.  String save = request.getParameter("Save"); 
Feb 22 '07 #4
abctech
157 New Member
Thanks for all your suggestions, I incorporated them and its working perfectly.

Earlier I was getting a lot of null pointer exceptions and I couldn't locate them hence I explicitly declared all objects as null ,thats why I was saying
Expand|Select|Wrap|Line Numbers
  1. String save = null; 
  2. save = request.getParameter("Save"); 
I've made it String save = request.getPara meter("Save"); now.Thanks.

you cannot open two resultsets at the same time
Can't open two resultset objects on the same table or any two resultset objects at one time?

I have some nested loops in which I need to fire some queries on multiple tables thus opening multiple resultsets, i.e something as foll -
Expand|Select|Wrap|Line Numbers
  1. if (s1.equals("something"))
  2. {                    
  3.     for (int j=0;j<s16.length;j++)
  4.     {
  5.     PreparedStatement pst1 = con.prepareStatement(selectStr);
  6.     pst1.setString(1,Name);
  7.     ResultSet rs1 = pst1.executeQuery();
  8.     while (rs1.next())
  9.     {
  10.                      long a = rs1.getLong(1);
  11.                      int b = rs11.getInt(2);
  12.  
  13.                      PreparedStatement pst2 =con.prepareStatement(select1Str);
  14.                      pst2.setLong(1,a);
  15.                      pst2.setInt(2,b);
  16.                      ResultSet rs2  = pst2.executeQuery();
  17.                      while(rs2.next())
  18.                      {    
  19.                           //some code
  20.                      }    
  21.     }
  22.    }                        
  23. }//if over    
Will opening rs1 and rs2 on the same/different table at the same time create any discrepancies in the output?

Also can I declare the PreparedStateme nt too outside the try-block and intialize it to null and then reuse the same in each of my 3 main-if's just like you'd suggested regarding the result sets?
Feb 22 '07 #5
r035198x
13,262 MVP
Thanks for all your suggestions, I incorporated them and its working perfectly.

Earlier I was getting a lot of null pointer exceptions and I couldn't locate them hence I explicitly declared all objects as null ,thats why I was saying
Expand|Select|Wrap|Line Numbers
  1. String save = null; 
  2. save = request.getParameter("Save"); 
I've made it String save = request.getPara meter("Save"); now.Thanks.


Can't open two resultset objects on the same table or any two resultset objects at one time?

I have some nested loops in which I need to fire some queries on multiple tables thus opening multiple resultsets, i.e something as foll -
Expand|Select|Wrap|Line Numbers
  1. if (s1.equals("something"))
  2. {                    
  3. for (int j=0;j<s16.length;j++)
  4. {
  5.     PreparedStatement pst1 = con.prepareStatement(selectStr);
  6.     pst1.setString(1,Name);
  7.     ResultSet rs1 = pst1.executeQuery();
  8.     while (rs1.next())
  9.     {
  10. long a = rs1.getLong(1);
  11. int b = rs11.getInt(2);
  12.  
  13. PreparedStatement pst2 =con.prepareStatement(select1Str);
  14. pst2.setLong(1,a);
  15. pst2.setInt(2,b);
  16. ResultSet rs2 = pst2.executeQuery();
  17. while(rs2.next())
  18. {    
  19. //some code
  20. }    
  21.     }
  22. }                        
  23. }//if over    
Will opening rs1 and rs2 on the same/different table at the same time create any discrepancies in the output?

Also can I declare the PreparedStateme nt too outside the try-block and intialize it to null and then reuse the same in each of my 3 main-if's just like you'd suggested regarding the result sets?
That will probably not work. You will get something like IllegalStateExc eption. Are you not able to change your design so that you have only one resulset open at a time?
Feb 22 '07 #6
abctech
157 New Member
Are you not able to change your design so that you have only one resulset open at a time?
Well, I don’t really understand how I can work around my code to avoid opening more than one resultsets at a time since as you can see in my previous post based on every single record of rs1 the query is fired and a fresh rs2 is obtained every time, then one by one the records of rs2 are retrieved and processed.

Just so you know rs1 is representing a different table and rs2 a different one, will using them in the above way still be incorrect?

Another portion of my program requires opening 2 resultsets on the same table at the same time, it’s like this:-

Expand|Select|Wrap|Line Numbers
  1. String selectNameStr = “Select * from abc where Name = ?;” ;
  2. String selectUsernameStr = “Select * from abc where Username = ?;” ;
  3.  
  4. PreparedStatement pst1 = con.prepareStatement(selectNameStr,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
  5. pst1.setString(1,FullName);
  6. ResultSet rs1 = pst1.executeQuery();
  7.  
  8. PreparedStatement pst2 = con.prepareStatement(selectUsernameStr,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);                    
  9. pst2.setString(1,Username);    
  10. ResultSet rs2  = pst2.executeQuery();
  11.  
  12. if (rs1.next() != rs1.isLast()) 
  13. {
  14.      //some code
  15. }
  16. else if (rs2.next() != rs2.isLast())
  17. {
  18.       //some code
  19. }
  20. else
  21. {
  22.       PreparedStatement pst3 = con.prepareStatement(updateStatementStr);
  23.       // some code and some more queries on table ‘abc’ .
  24. }
Will this code too give erroneous output since again rs1 and rs2 etc are fetching records from the same table ‘abc’ at one time?

My program is incomplete and very vast and I still have to compile it, but I want to take care that I approach it in the correct manner so that later I don’t have to spend too much time rectifying it. All your assistance much appreciated r035198x.
Feb 22 '07 #7
r035198x
13,262 MVP
Well, I don’t really understand how I can work around my code to avoid opening more than one resultsets at a time since as you can see in my previous post based on every single record of rs1 the query is fired and a fresh rs2 is obtained every time, then one by one the records of rs2 are retrieved and processed.

Just so you know rs1 is representing a different table and rs2 a different one, will using them in the above way still be incorrect?

Another portion of my program requires opening 2 resultsets on the same table at the same time, it’s like this:-

Expand|Select|Wrap|Line Numbers
  1. String selectNameStr = “Select * from abc where Name = ?;” ;
  2. String selectUsernameStr = “Select * from abc where Username = ?;” ;
  3.  
  4. PreparedStatement pst1 = con.prepareStatement(selectNameStr,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
  5. pst1.setString(1,FullName);
  6. ResultSet rs1 = pst1.executeQuery();
  7.  
  8. PreparedStatement pst2 = con.prepareStatement(selectUsernameStr,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);                    
  9. pst2.setString(1,Username);    
  10. ResultSet rs2 = pst2.executeQuery();
  11.  
  12. if (rs1.next() != rs1.isLast()) 
  13. {
  14. //some code
  15. }
  16. else if (rs2.next() != rs2.isLast())
  17. {
  18. //some code
  19. }
  20. else
  21. {
  22. PreparedStatement pst3 = con.prepareStatement(updateStatementStr);
  23. // some code and some more queries on table ‘abc’ .
  24. }
Will this code too give erroneous output since again rs1 and rs2 etc are fetching records from the same table ‘abc’ at one time?

My program is incomplete and very vast and I still have to compile it, but I want to take care that I approach it in the correct manner so that later I don’t have to spend too much time rectifying it. All your assistance much appreciated r035198x.
You better create arraylists to hold the data temporarily because opening two resultsets at the same time will not work It does not matter if they have data from different tables.
Feb 22 '07 #8
abctech
157 New Member
You better create arraylists to hold the data temporarily because opening two resultsets at the same time will not work It does not matter if they have data from different tables.
Okay,
I will do that then.Thanks a lot for all your inputs !!!
Feb 22 '07 #9
r035198x
13,262 MVP
Okay,
I will do that then.Thanks a lot for all your inputs !!!
Would be easier if you have classes for each of the tables you are getting data from, then you can retrieve the data into objects of that class and strore the objects themselves in the arraylist.
Feb 22 '07 #10

Sign in to post your reply or Sign up for a free account.

Similar topics

3
6529
by: Jose Munoz | last post by:
Hi all, I want to share some data for all my applications (servlets and jsps). For this i am using a JSP to set the variables with scope=application. When i get this data from some JSP all is o.k, i can see the data that i saved, but when i get access with my servlets, i can't see data saved prev. My request is simple: save data with a JSP and read this data with servlets.? please if you send me a small sample to do this. or tell me...
2
5175
by: Steven O. | last post by:
First, this may not be the correct newsgroup. I have some relatively basic questions on SQL. I tried to find a newsgroup that was specifically just about SQL, and was surprised to find that all the SQL-related newsgroups seem to be product related. But if I missed something, and someone can steer me to a correct newsgroup, please do so. My specific questions: 1. I want to put comments in an SQL script. For example, I want
4
2220
by: Ramesh | last post by:
hi, Let me ask some basic questions. Can anybody explain me about the following questions: 1. When we have to create sn key? Whenever we compiled Component we have to create or it is a one time process? 2. What information contained in sn key. I gone through that it is having public key. How it is using this key to intract with client. 3. When we have to run gacutil.exe file. Whenever we
18
3152
by: Frances | last post by:
I want to learn PHP.. I know JSP, Servlets, have been using Tomcat for 2 years now, and even though I know there are ways you can use PHP in conjunction with Tomcat, I'd rather not tinker with Tomcat.. I think I'd rather try to do it straight 'from scratch'... following instructions here, http://us2.php.net/tut.php.. so you need both Apache **AND** PHP server? not sure what to dl when get to http://www.apache.org/ (HTTP Server? top...
0
4580
by: connectrajesh | last post by:
INTERVIEWINFO.NET http://www.interviewinfo.net FREE WEB SITE AND SERVICE FOR JOB SEEKERS /FRESH GRADUATES NO ADVERTISEMENT
3
1959
by: Bit Byte | last post by:
I have written a custom servlet engine (and "wrapper" servlets) for some legacy code (C/C++) that I have. The servlets contain the bulk of my 1st 2 layers in a 3 tier architecture - i.e. data layer and business logic layer respectively. Is it technically possible to use my servlets for the first two layers and then use ASP.Net for the presentation layer (i.e. using webforms etc)? The obvious "bridge" would be SOAP, but I want a more...
2
1667
by: midhunkreddy | last post by:
Hi this is midhun i am in development,i want to know how to call the servlets using visual basic please post the answers
0
1988
by: ank99 | last post by:
hello...i m trying to run servlets(using GET) from wml page..... using apache tomcat 5.5 server and WinWap for Windows(version 3.2.1.28.)....its working fine as far as just to display wml form page... but when i enter the data within wml page(i.e. compname) then address within browser gets to http://localhost:8080/servlets-examples/servlet/portsam?compname=abc-b39ea2eee69 as per required but it says it could not get required URL(HTTP Error...
1
2779
by: ank99 | last post by:
hello...i m trying to run servlets(using GET) from wml page..... web server : apache tomcat 5.5 server WAP Browser: WinWap for Windows(version 3.2.1.28.).... its working fine as far as just to display wml form page... but when i enter the data within wml page(i.e. compname) then address within browser gets to http://localhost:8080/servlets-examples/servlet/portsam?compname=abc-b39ea2eee68 as per required but it says it could not get...
0
8361
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
8807
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
8701
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
1
8466
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
0
7299
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own.... Now, this would greatly impact the work of software developers. The idea...
1
6158
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
4290
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
1912
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
2
1588
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.